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

2022-09-05 00:41:52

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

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

注意:我已经阅读了此处的Stack Overflow问题 如何按字典的值对字典列表进行排序?并且可能更改我的代码以包含字典列表,但是由于我并不真正需要字典列表,我想知道是否有更简单的解决方案按升序或降序排序。


答案 1

Python 3.7+ 或 CPython 3.6

字典在Python 3.7 +中保留插入顺序。在CPython 3.6中也是如此,但它是一个实现细节

>>> x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

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

较旧的 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中,由于不允许解压缩,我们可以使用

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

如果希望将输出作为字典,可以使用集合。OrderDict

import collections

sorted_dict = collections.OrderedDict(sorted_x)

答案 2

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

好吧,实际上可以执行“按字典值排序”。最近我不得不在代码高尔夫中这样做(堆栈溢出问题代码高尔夫:词频图表)。删节后,问题是这样的:给定一个文本,计算每个单词遇到的频率,并显示一个按频率递减的顶级单词列表。

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

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

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

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

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


推荐