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

python sorting dictionary


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

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

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




Answer 1 Devin Jeanpierre


Python 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}

较旧的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])

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

import collections

sorted_dict = collections.OrderedDict(sorted_x)



Answer 2 Nas Banov


就像这样简单: sorted(dict1, key=dict1.get)

好吧,实际上可以执行“按字典值排序”。最近,我不得不在Code Golf(堆栈溢出问题Code golf:单词频率图表)中进行此操作。简而言之,该问题属于此类问题:给定文本,计算遇到每个单词的频率,并显示按频率递减排序的最重要单词列表。

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

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
    d[w] += 1

那么您可以获取单词列表,并按 sorted(d, key=d.get) 的使用频率进行排序 -使用单词出现的次数作为sort key,排序遍历字典键。

for w in sorted(d, key=d.get, reverse=True):
    print(w, d[w])

我写这个详细的解释,是为了说明人们常说的 "我可以很容易地按键排序,但如何按值排序"--我想原帖就是想解决这样一个问题。而解决的办法就是根据键的值,做排序列表,如上图。




Answer 3 Mark


你可以用。

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

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

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

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

Input:

d = {'one':1,'three':3,'five':5,'two':2,'four':4}
a = sorted(d.items(), key=lambda x: x[1])    
print(a)

Output:

[('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]



Answer 4 Roberto Bonvallet


Dicts不能排序,但你可以用它们建立一个排序的列表。

一个排序的dict值列表。

sorted(d.values())

一个(键,值)对的列表,按值排序。

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))



Answer 5 mykhal


在最近的Python 2.7中,我们有了新的OrderedDict类型,该类型可以记住添加项目的顺序。

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

要从原来的字典中制作一个新的有序字典,按值排序。

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

OrderedDict的行为就像一个普通的dict。

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])