9. 如何根据值对字典排序

题目

我有一个从数据库的两个字段中读取值的字典:一个字符串字段和一个数字字段。字符串字段是惟一的,所以这是字典的key。 我可以对键进行排序,但是如何根据值排序呢? 注意:我读过Stack Overflow的问题我如何用Python中的dictionary来对字典排序?而且可能会改变我的代码来拥有一个字典列表,但是因为我不需要一个字典列表,所以我想知道是否有一个更简单的解决方案。 链接

回答一

对字典进行排序是不可能的,只是为了得到一个已排序的字典的表示。字典本身是没有顺序的,但是其他类型,如列表和元组,则不是。因此,您需要一个有序的数据类型来表示排序的值,这将是一个列表——可能是一个元组列表。

例如:

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

回答二

sorted(dict1, key=dict1.get)一样简单

实际上,可以用字典的值来排序。最近我在Stack Overflow上一个代码高尔夫(Code Golf: Word frequency chart)中做了这个工作。问题是这样的:给定一个文本,计算每个单词遇到的频率,并显示最上面的单词列表,按减少频率排序。 如果你构造一个字典,把单词作为键,并将每个单词的出现次数作为值,在这里简化为:

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]

我正在写这个详细的解释,以说明人们常说的“我可以很容易地按关键字分类词典,但我如何按价值排序”——我认为OP试图解决这样的问题。解决方案是按照上面所示的值,对键进行排序。

回答三

你可以使用:

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

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

geekcircle            updated 2018-06-25 23:51:50

results matching ""

    No results matching ""