例如,某班英语成绩以字典形式存储为:
{
'Lilei': 79,
'Jim': 88,
'Lucy': 92,
...
}
要求:根据成绩高低,计算学生排名。
解决方案:将字典中的各项转换为元组,使用内置函数sorted()
排序。
-
将字典中的项转化为(值,键)元组,使用列表解析或
zip()
; -
传递
sorted()
函数的key参数。
- 对于元组的比较:
print((3, 1) > (2, 4))
print((3, 1) > (3, 2))
print((2, 7) < (4, 1))
True #结果
False
True
元组的元素依次比较。前面元素更大的元组更大,前面元素更小的元组更小,只有当前面元组相等时才会进行后面元素的比较,依次类推。
- 对于
zip()
函数:
zip(iter1 [,iter2 [...]])
z = zip((1, 2, 3, 4, 5), (6, 7, 8, 9, 10))
print(list(z))
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] #结果
zip()
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*
号操作符,可以将元组解压为列表。
- 方案1示例:
列表解析:
from random import randint
d = {k: randint(60, 100) for k in 'abcdefgh'} #生成8个分数在(60,100之间)的元素的成绩字典
answer = [(v,k) for k,v in d.items()]
print(sorted(answer, reverse=True))
[(96, 'g'), (95, 'f'), (88, 'c'), (86, 'e'), (86, 'b'), (80, 'a'), (66, 'd'), (60, 'h')] #结果
zip()
函数:
from random import randint
d = {k: randint(60, 100) for k in 'abcdefgh'} #生成8个分数在(60,100之间)的元素的成绩字典
answer = list(zip(d.values(), d.keys()))
print(sorted(answer, reverse=True))
[(98, 'b'), (89, 'e'), (88, 'd'), (79, 'c'), (67, 'f'), (67, 'a'), (66, 'h'), (60, 'g')] #结果
- 方案2示例:
from random import randint
d = {k: randint(60, 100) for k in 'abcdefgh'} #生成8个分数在(60,100之间)的元素的成绩字典
answer = sorted(d.items(), key=lambda item: item[1], reverse=True)
answer = {k:(i, v) for i,(k,v) in enumerate(answer, 1)} #字典解析
print(answer)
{'b': (1, 98), 'e': (2, 96), 'h': (3, 92), 'f': (4, 91), 'd': (5, 81), 'a': (6, 75), 'c': (7, 71), 'g': (8, 64)} #结果