Python 3按其值对dict进行排序

时间:2014-01-06 06:44:04

标签: python python-3.x sorting dictionary

我找到的唯一方法是为python2工作或只返回元组列表。

是否可以对字典进行排序,例如{"aa": 3, "bb": 4, "cc": 2, "dd": 1},按其值?

我想要实现的排序字典顺序是从最大到最小。我希望结果看起来像这样:

bb 4
aa 3
cc 2
dd 1

排序后我想将其存储到文本文件中。

6 个答案:

答案 0 :(得分:85)

itemgetter(见其他答案)(对我来说)对大型词典更有效,但对于常见情况,我相信d.get获胜。并且它不需要额外的import

>>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
>>> s = [(k, d[k]) for k in sorted(d, key=d.get, reverse=True)]
>>> for k, v in s:
...     k, v
...
('bb', 4)
('aa', 3)
('cc', 2)
('dd', 1)

请注意,您也可以将d.__getitem__设置为key函数,这可能会比d.get提供较小的性能提升。

答案 1 :(得分:26)

from collections import OrderedDict
from operator import itemgetter    

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True)))

打印

OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)])

虽然从你的最后一句话来看,似乎元组列表可以正常工作,例如。

from operator import itemgetter  

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
for key, value in sorted(d.items(), key = itemgetter(1), reverse = True):
    print(key, value)

打印

bb 4
aa 3
cc 2
dd 1

答案 2 :(得分:7)

要对字典进行排序,我们可以使用运算符模块。 Here是操作员模块文档。

import operator                             #Importing operator module
dc =  {"aa": 3, "bb": 4, "cc": 2, "dd": 1}  #Dictionary to be sorted

dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True)
print dc_sort

输出序列将是一个排序列表:

[('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]

如果我们想对键进行排序,我们可以使用

dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True)

输出顺序为:

[('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)]

答案 3 :(得分:3)

一种更简单(且速度提高约10%)的方法是使用lambda表达式

d = {'aa': 3, 'bb': 4, 'cc': 2, 'dd': 1}
s = sorted(d.items(), key=lambda x: x[1], reverse=True)

for k, v in s:
    print(k, v)

时间

%%timeit在CPython 3.7上,用print(k, v)代替了pass,使IO不受限制。

使用d.get()接受的答案:

1.19 µs ± 16.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Lambda表达式:

1.07 µs ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

答案 4 :(得分:0)

要对字典进行排序并使其在之后保持字典状态,您可以使用标准库中的OrderedDict

如果那不是你需要的,那么我建议你重新考虑那些给你留下元组列表的排序函数。如果不是有序的键值对(元组)列表,你想要什么输出?

答案 5 :(得分:0)

如果要按反向顺序(从大到小的)按排序

{k: d[k] for k in sorted(d, key=d.get, reverse=True)}
# {'b': 4, 'a': 3, 'c': 2, 'd': 1}

如果您要按进行常规排序(从小到大)

{k: d[k] for k in sorted(d, key=d.get)}
# {'d': 1, 'c': 2, 'a': 3, 'b': 4}

如果您要按进行常规排序

{k: d[k] for k in sorted(d)}
# {'a': 3, 'b': 4, 'c': 2, 'd': 1}

这适用于CPython 3.6+和Python 3.7+的任何实现,因为字典保持插入顺序。