我有一个从数据库中的两个字段读取的值字典:字符串字段和数字字段。字符串字段是唯一的,因此这是字典的关键字。
我可以对键进行排序,但是如何根据值进行排序?
注意:我已阅读 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])
这将根据字典中从最小到最大的每个条目的值对字典进行排序。