Python根据字典中的值对字典进行排序

1, 转换字典为元组,然后对值进行排序

 #!/usr/bin/env python3

from random import randint

d1 = {k: randint(60, 100) for k in 'abcdefg'}    //*生成一个随机字典
l1 = [(v, k) for k, v in d1.items()]             //*转换字典为列表,并且值在前,键在后
print(d1)                                        //*打印字典数据
print(l1)                                        //*打印列表数据
print(sorted(l1, reverse=True))                  //*打印排序后的列表数据,sorted()函数用来排序,reverse=True为反向排序
[[email protected] ~]# ./learn.py
{'a': 89, 'b': 80, 'c': 87, 'd': 80, 'e': 77, 'f': 98, 'g': 86}
[(89, 'a'), (80, 'b'), (87, 'c'), (80, 'd'), (77, 'e'), (98, 'f'), (86, 'g')]
[(98, 'f'), (89, 'a'), (87, 'c'), (86, 'g'), (80, 'd'), (80, 'b'), (77, 'e')]

同样也可以使用zip()函数进行上面的操作

#!/usr/bin/env python3

from random import randint

d1 = {k: randint(60, 100) for k in 'abcdefg'}
l1 = list(zip(d1.values(), d1.keys()))           //*zip()函数可以同时迭代两组数据
s1 = sorted(l1, reverse=True)
print(d1)
print(l1)
print(s1)
[[email protected] ~]# ./learn.py
{'a': 92, 'b': 96, 'c': 85, 'd': 66, 'e': 89, 'f': 98, 'g': 77}
[(92, 'a'), (96, 'b'), (85, 'c'), (66, 'd'), (89, 'e'), (98, 'f'), (77, 'g')]
[(98, 'f'), (96, 'b'), (92, 'a'), (89, 'e'), (85, 'c'), (77, 'g'), (66, 'd')]

2, 通过sorted()函数的指定key方法进行直接排序

In [7]: from random import randint

In [8]: d1 = {k: randint(60, 100) for k in 'abcdefg'}
In [9]: d1
Out[9]: {'a': 79, 'b': 100, 'c': 85, 'd': 62, 'e': 74, 'f': 82, 'g': 91}

In [10]: d1.items()
Out[10]: [('a', 79), ('c', 85), ('b', 100), ('e', 74), ('d', 62), ('g', 91), ('f', 82)]

In [11]: sorted(d1.items(), key=lambda item:item[1], reverse=True)    //*使用lambda匿名函数获取d1.items()函数返回的第一个[1]索引为key,也是是字典里的值。
Out[11]: [('b', 100), ('g', 91), ('c', 85), ('f', 82), ('a', 79), ('e', 74), ('d', 62)]

3, 对排序后的结果重新解析成字典

In [21]: list(enumerate(final))    //*enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
Out[21]:
[(0, ('b', 100)),                  //*但是我们要的是排名信息,0明显是不对的。
 (1, ('g', 91)),
 (2, ('c', 85)),
 (3, ('f', 82)),
 (4, ('a', 79)),
 (5, ('e', 74)),
 (6, ('d', 62))]

设置enumerate()函数的start参数来指定起始值

In [22]: list(enumerate(final, 1))
Out[22]:
[(1, ('b', 100)),
 (2, ('g', 91)),
 (3, ('c', 85)),
 (4, ('f', 82)),
 (5, ('a', 79)),
 (6, ('e', 74)),
 (7, ('d', 62))]

既然我们现在知道了enumerate()函数的用法,那么下面就可进行字典重组的操作了。

In [11]: {p: (v, k) for p, (k, v) in enumerate(final, 1)}    //*使用字典解析,拆分enumerate()函数的值并进行重组
Out[11]:
{1: (95, 'c'),
 2: (93, 'd'),
 3: (91, 'b'),
 4: (90, 'g'),
 5: (85, 'f'),
 6: (71, 'a'),
 7: (60, 'e')}