python百例练习之第十九例-sorted()结合itemgetter排序

问题

您需要编写程序以升序对(名称,年龄,身高)元组进行排序,其中名称是字符串,年龄和身高是数字。元组由控制台输入。排序标准是:
1:根据名称排序;
2:然后根据年龄排序;
3:然后按分数排序。
优先级是名称>年龄>得分。
如果给出以下元组作为程序的输入:
Tom,19,80
John,20,90
Jony,17,91
Jony,17,93
Json,21,85
然后,程序的输出应为:
[(‘John’,‘20’,‘90’),(‘Jony’,‘17’,‘91’),(‘Jony’,‘17’,‘93’),(‘Json’,'21 ',‘85’),(‘Tom’,‘19’,‘80’)]

提示:
如果将输入数据提供给问题,则应假定它是控制台输入。
我们使用itemgetter启用多个排序键。

程序

from operator import itemgetter, attrgetter

l = []
while True:
    s = input()
    if not s:
        break
    l.append(tuple(s.split(",")))  #类型转换为元组,并将这些元组全都添加到一个列表中

print(sorted(l, key=itemgetter(0,1,2)))  #itemgetter是对同一个列表内的序列排序,也就是对多维度序列排序,这个索引就是每个元组内元素的索引,

sorted()、itemgetter()

在这个例子中,我们对多维度序列的排序是有优先级的,一旦按某一优先级排序时产生了元素相同的情况 无法排序,那么就按照下一级的优先级去排序。
所以这里就可以用到sorted()结合itemgetter(),怎么用呢?

先说一下itemgetter():
operator.itemgetter函数用于获取对象的哪些维的数据,参数为一些索引号(即需要获取的数据在对象中的索引号),但是这个索引号的顺序是可以按照需要的顺序去取的,不需要和原列表一样。要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
eg:

a = [1,2,3]
>>> b=operator.itemgetter(1,0)  #定义函数b,获取对象的第1个域和第0个域的值,索引顺序按照我们的需要随便安排
>>> b(a)  #这里是向函数b传入了实参a,也就是说的将函数作用到对象上才能获取值
(2, 1)

再说一下sorted(),大家应该都比较熟悉,sorted()内包含三个参数,分别是list_name,key,reverse。itemgetter()对应的就是key参数,指定排序规则。两者结合可以对一个多维度的序列进行排序。
eg:

sorted(students, key=operator.itemgetter(21)) #实现多级排序,此处要根据第二个域和第三个域进行排序,优先级是先根据第三个域排序,如果按照第三个域无法对某几个相同元素排序没有办法排序,那就再根据下一个优先级也就是第二个域排序。

你可能感兴趣的:(python练习)