如何按值(DESC)然后按键(ASC)对字典进行排序?

时间:2013-03-12 20:40:44

标签: python sorting key

在发现惊人的sorted()之后,我再次陷入困境。

问题是我有一个string(key) : integer(value)形式的字典,我需要按其整数值的降序排序,但是如果两个元素的值相同,那么按密钥的升序排列。

一个让它更清晰的例子:

d = {'banana':3, 'orange':5, 'apple':5}
out: [('apple', 5), ('orange', 5), ('banana', 3)]

在做了一些研究后,我得到了类似的东西:

sorted(d.items(), key=operator.itemgetter(1,0), reverse=True)
out: [('orange', 5), ('apple', 5), ('banana', 3)]

这是因为它对值和键进行了反向排序。我需要钥匙不要反转。

2 个答案:

答案 0 :(得分:38)

这样的东西
In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0]))
Out[2]: [('apple', 5), ('orange', 5), ('banana', 3)]

答案 1 :(得分:-1)

  • 字典无法直接排序,因此您需要对 items()(包含键/值对的元组列表)进行排序。

  • 由于您希望按值字段排序,然后是关键字段,因此必须使用获取指定字段的operator.itemgetter从元组中提取这些字段以用作排序键。 / p>

  • 最后,要对一个字段进行降序排序并对另一个字段进行降序,请执行两次传递,首先按二级键升序排序,然后按主键降序排序另一次。此步骤依赖于Python sort stability

例如:

import operator
In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: fruit = sorted(d.items(), key=operator.itemgetter(0))
In [3]: sorted(fruit, key=operator.itemgetter(1), reverse=True)
Out[3]: [('apple', 5), ('orange', 5), ('banana', 3)]

有关详细信息,请参阅Python Sorting-HOWTO guide