一尘不染

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

javascript

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

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

注意:我在这里阅读了堆栈溢出问题如何按字典的值对字典列表进行排序?并且可能可以将我的代码更改为具有字典列表,但是由于我真的不需要字典列表,因此我想知道是否有更简单的解决方案可以按升序或降序排序。


阅读 235

收藏
2022-01-15

共2个答案

一尘不染

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])

如果要将输出作为字典,可以使用collections.OrderedDict

import collections

sorted_dict = collections.OrderedDict(sorted_x)
2022-01-15
一尘不染

很简单:sortedct1, key=dict1.get)

好吧,实际上可以进行“按字典值排序”。最近我不得不在 Code Golf 中这样做。简而言之,问题是这样的:给定一个文本,计算每个单词出现的频率,并显示一个排名靠前的单词列表,按频率递减排序。

如果你构建一个以单词为键,每个单词出现的次数为值的字典,这里简化为:

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])

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

2022-01-15