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

2024-04-19 07:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我可以按键排序,但如何根据值排序?

注意:我在这里读过堆栈溢出问题,可能会将我的代码更改为有一个字典列表,但是由于我不需要字典列表,所以我想知道是否有一个更简单的解决方案可以按升序或降序排序。


Tags: 字符串代码数据库列表字典排序堆栈数字
3条回答

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

嗯,实际上可以做一个“按字典值排序”。最近我不得不在一个代码高尔夫(堆栈溢出问题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试图解决这样一个问题。解决方案是根据值对键进行排序,如上图所示。

Python3.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}

较老的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_x = sorted(x.items(), key=lambda kv: kv[1])

如果希望输出为dict,可以使用^{}

import collections

sorted_dict = collections.OrderedDict(sorted_x)

您可以使用:

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

这将按字典中每个条目的值从最小到最大对字典进行排序。

要按降序排序,只需添加reverse=True

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

相关问题 更多 >