为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2019-05-22 12:52:50
如何按值对字典进行排序?我有一个从数据库中的两个字段读取的值字典:字符串字段和数字字段。字符串字段是唯一的,因此这是字典的键。我可以对键进行排序,但是如何根据值进行排序?
查看完整描述

5 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

不可能对字典进行排序,只能获得已排序字典的表示。字典本质上是无序的,但其他类型(如列表和元组)则不是。所以你需要一个有序的数据类型来表示排序的值,这将是一个列表 - 可能是一个元组列表。

例如,

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,可以使用collections.OrderedDict

import collections

sorted_dict = collections.OrderedDict(sorted_x)


查看完整回答
反对 回复 2019-05-22
?
长风秋雁

TA贡献1757条经验 获得超7个赞

很简单: 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)排序 - 排序迭代字典键,使用单词出现次数作为排序键。

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

我正在写这个详细的解释,以说明人们通常所说的“我可以轻松地按键排序字典,但我如何按价值排序” - 我认为OP试图解决这个问题。解决方案是根据值做一些键列表,如上所示。


查看完整回答
反对 回复 2019-05-22
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

你可以使用:

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

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

要按降序对其进行排序,只需添加reverse=True

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


查看完整回答
反对 回复 2019-05-22
?
精慕HU

TA贡献1845条经验 获得超8个赞

Dicts无法排序,但您可以从中构建排序列表。

dict值的排序列表:

sorted(d.values())

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

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


查看完整回答
反对 回复 2019-05-22
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

在最近的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: 2fourth: 4third: 3first: 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: 1second: 2third: 3fourth: 4>>> 
d_sorted_by_valueOrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])


查看完整回答
反对 回复 2019-05-22
  • 5 回答
  • 0 关注
  • 6813 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信