我有一个从数据库中的两个字段读取的值字典:一个字符串字段和一个数字字段。字符串字段是唯一的,因此它是字典的键。
我可以对键进行排序,但是如何根据值进行排序?
注意:我在这里阅读了堆栈溢出问题如何按字典的值对字典列表进行排序?并且可能可以将我的代码更改为具有字典列表,但是由于我真的不需要字典列表,因此我想知道是否有更简单的解决方案可以按升序或降序排序。
字典在 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}
不可能对字典进行排序,只能获得已排序字典的表示。字典本质上是无序的,但其他类型,例如列表和元组,则不是。所以你需要一个有序的数据类型来表示排序后的值,这将是一个列表——可能是一个元组列表。
例如,
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.
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:
collections.OrderedDict
import collections sorted_dict = collections.OrderedDict(sorted_x)
好吧,实际上可以进行“按字典值排序”。最近我不得不在 Code Golf 中这样做。简而言之,问题是这样的:给定一个文本,计算每个单词出现的频率,并显示一个排名靠前的单词列表,按频率递减排序。
如果你构建一个以单词为键,每个单词出现的次数为值的字典,这里简化为:
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])
我正在写这个详细的解释来说明人们通常所说的“我可以轻松地按键排序字典,但我如何按值排序” - 我认为原始帖子试图解决这样一个问题。解决方案是根据值对键列表进行排序,如上所示。