python - Python字典按值排序

  显示原文与译文双语对照的内容

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

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

注意:我已经阅读了堆栈溢出问题如何按 python 中字典的值对字典列表进行排序? ,可能会更改我的代码以获得字典列表,但是因为我不需要一个字典列表,我想知道是否有一个简单的解决方案。

时间:

不能对dict进行排序,只能得到一个排序的dict表示。 Dicts天生是 orderless,但其他类型( 如列表和元组) 不是。 所以你需要一个排序的表示,它是一个list—probably列表。

例如,


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)

实际上可以做一个"按字典值排序"。 最近我不得不在一个代码高尔夫中做( 堆栈溢出问题 代码高尔夫: 单词频率图 ) 。 总之,问题是: 给定一个文本,计算每个单词的频率和显示单词的列表,按降序排序。

如果你用关键字作为关键字构造字典,并将每个单词的出现次数作为值,在这里简化为


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]

我正在写这个详细的解释,以说明人们通常用"我可以按关键字轻松排序字典,但如何按值排序"表示什么,我认为OP试图解决这样一个问题。 解决方案是根据值执行键列表,如下所示。

Dicts无法排序,但你可以从它们构建一个排序列表。

字典值的排序列表:

 
sorted(d.values())

 

( 键,值) 对列表,按值排序:


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

在最近的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)])

新回答 --两年后期---


它通常可以很方便地被用来使用 namedtuple 。 例如你有一个'姓名'字典作为键和'得分'作为值,你想要在'得分'上排序:


import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

以最低分数排序:


worst = sorted(Player(v,k) for (k,v) in d.items())

以最高分数排序:


best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

现在,你可以获得名称和分数,让我们假设second-best播放器( index=1 ) 非常像这样:


 player = best[1]
 player.name
 'Richard'
 player.score
 7

在 python 2.7中,只需执行以下操作:


from collections import OrderedDict
# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

copy-paste来自:http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes

享受;- )

我有同样的问题,我像这样解决了:


WantedOutput = sorted(MyDict, key=lambda x : MyDict[x]) 

( 回答:"不能对字典排序"没有阅读这个问题 ! 实际上"我可以按关键字排序,但如何根据值排序"显然意味着他想要按照值的值排序的键列表。)?

请注意,顺序的定义不正确( 在输出列表中,具有相同值的键将按任意顺序排列)

你可以使用 collections.Counter 。 注意,这对于数值和non-numeric值都是有效的。


>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> from collections import Counter
>>> #To sort in reverse order
>>> Counter(x).most_common()
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> Counter(x).most_common()[::-1]
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> #To get a dictionary sorted by values
>>> from collections import OrderedDict
>>> OrderedDict(Counter(x).most_common()[::-1])
OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

...