问题
您需要编写程序以升序对(名称,年龄,身高)元组进行排序,其中名称是字符串,年龄和身高是数字。元组由控制台输入。排序标准是:
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(2,1)) #实现多级排序,此处要根据第二个域和第三个域进行排序,优先级是先根据第三个域排序,如果按照第三个域无法对某几个相同元素排序没有办法排序,那就再根据下一个优先级也就是第二个域排序。