按值和按键对字典内容进行排序

4

将字典按值排序的方法已经被详细介绍过,可以通过以下方式实现:

d={'d':1,'b':2,'c':2,'a':3}
sorted_res_1= sorted(d.items(), key=lambda x: x[1]) 
# or
from operator import itemgetter 
sorted_res_2 = sorted(d.items(), key=itemgetter(1)) 

我的问题是,如何以最佳方式实现以下输出:

[('d', 1), ('b', 2), ('c', 2), ('a', 3)] 而不是 [('d', 1), ('c', 2), ('b', 2), ('a', 3)]

这样元组就按值排序,然后按键进行排序,如果值相等。

其次,对于反向排序,是否可能出现以下情况: [('a', 3), ('b', 2), ('c', 2), ('d', 1)] 而不是 [('a', 3), ('c', 2), ('b', 2), ('d', 1)]?
3个回答

4

sorted函数的key参数可以返回一个元组。在这种情况下,元组中的第一项用于排序,第二项用于打破平局,第三项用于仍然平局的情况,以此类推...

In [1]: import operator

In [2]: d={'d':1,'b':2,'c':2,'a':3}

In [3]: sorted(d.items(),key=operator.itemgetter(1,0))
Out[3]: [('d', 1), ('b', 2), ('c', 2), ('a', 3)]

operator.itemgetter(1,0) 返回一个由第二个和第一个项目组成的元组。也就是说,如果 f=operator.itemgetter(1,0) 那么 f(x) 会返回 (x[1],x[0])


注意:itemgetter只有在Python >2.5版本中才能使用多个项目。 - Shawn Chin
能否将第一个按顺序排序,第二个按相反顺序排序,即 [('a', 3), ('b', 2), ('c', 2), ('d', 1)]? - Damian
1
@Damian:您可以通过将整数变为其负数来实现:sorted(d.items(),key=lambda x: (-x[1],x[0])) - unutbu

2

您只想要标准的tuple比较,但需要反向模式:

>>> sorted(d.items(), key=lambda x: x[::-1])
[('d', 1), ('b', 2), ('c', 2), ('a', 3)]

0

一种替代方法,非常接近您自己的示例:

sorted(d.items(), key=lambda x: (x[1], x[0]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接