协慌网

登录 贡献 社区

如何按值对字典进行排序?

我有一个从数据库中的两个字段读取的值字典:字符串字段和数字字段。字符串字段是唯一的,因此这是字典的关键字。

我可以对键进行排序,但是如何根据值进行排序?

注意:我已阅读 Stack Overflow 问题如何按 Python 中字典的值对字典列表进行排序?并且可能会改变我的代码以获得字典列表,但由于我不需要字典列表,我想知道是否有更简单的解决方案。

答案

不可能对字典进行排序,只是为了获得已排序的字典的表示。字典本质上是无序的,但其他类型(如列表和元组)则不是。因此,您需要一个有序数据类型来表示排序值,这将是一个列表 - 可能是元组列表。

例如,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x将是由每个元组中的第二个元素排序的元组列表。 dict(sorted_x) == x

对于那些希望按键而不是值进行排序的人:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

在 Python3 中,因为不允许解包[1]我们可以使用

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_by_value = sorted(x.items(), key=lambda kv: kv[1])

很简单: sorted(dict1, key=dict1.get)

嗯,实际上可以做一个 “按字典值排序”。最近我必须在 Code Golf(Stack Overflow 问题代码高尔夫:Word 频率图表 )中这样做。简而言之,问题就是这样:给定一个文本,计算每个单词遇到的频率,并显示顶部单词列表,按频率降低排序。

如果构造一个字典,其中单词为键,每个单词的出现次数为值,则简化为:

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
  d[w] += 1

然后你可以得到一个单词列表,按使用频率sorted(d, key=d.get)sorted(d, key=d.get) - 排序迭代字典键,使用单词出现次数作为排序键。

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

我正在写这个详细的解释,以说明人们通常所说的 “我可以轻松地按键排序字典,但我如何按价值排序” - 我认为 OP 试图解决这个问题。解决方案是根据值对键进行排序,如上所示。

你可以使用:

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

这将根据字典中从最小到最大的每个条目的值对字典进行排序。