26

在发现了惊人的之后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)]

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

4

2 回答 2

67

就像是

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)]
于 2013-03-12T20:44:00.057 回答
-1
  • 字典不能直接排序,因此您需要对items()进行排序,即包含键/值对的元组列表。

  • 由于您要按值字段排序,然后按键字段排序,因此有必要从元组中提取这些字段以用作operator.itemgetter获取指定字段的排序键。

  • 最后,要对一个字段进行降序排序,然后对另一个字段进行降序排序,请执行两遍,首先按辅助键升序排序,然后再按主键降序排序。这一步依赖于 Python 的排序稳定性

例如:

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 指南

于 2016-04-01T22:39:27.380 回答