在Python 3.6+中按值对字典进行排序

11

我在寻找一种方法来对Python字典按其值进行排序,经过几次尝试,以下是得出的结果:

a = {<populated dict...>}
a = {v: k for k, v in a.items()}
a = {v: k for k, v in sorted(a.items())}

这段代码似乎可以工作,但我认为它的性能比较差,有更好的方法吗?


1
可能是如何按键排序字典?的重复问题。 - abc
5
@新手,不确定按键排序的问题如何成为要求按值排序的重复问题? - Stephen Rauch
4个回答

18

您无需执行双键/值交换,可以执行以下操作:

a = {k: v for k, v in sorted(a.items(), key=lambda x: x[1])}

(排序文档)

测试代码:

data = dict(a=1, b=3, c=2)
print(data)
data_sorted = {k: v for k, v in sorted(data.items(), key=lambda x: x[1])}
print(data_sorted)

结果:

来自于CPython 3.6:

{'a': 1, 'b': 3, 'c': 2}
{'a': 1, 'c': 2, 'b': 3}

这种方式会如何对字典进行排序? - Peter Wood
@PeterWood,在CPython 3.6和Python 3.7+中,字典是有序的。 - Stephen Rauch
1
我不喜欢这种方法。插入排序是自3.6版本以来的一个特性,但是根据文档,“这个新实现中保持顺序的方面被认为是一项实现细节,不应该依赖于它”。 - abc
3
@newbie,从技术上讲,你是正确的。但是对于全世界99%的人来说,CPython就是Python。而至少在这个功能上,在3.7中它不再是实现细节。 - Stephen Rauch

3

默认情况下,字典是按键排序的,但 sorted() 函数可以接受一个函数作为参数,通过该函数可以改变程序的行为。

d={'a':6,'b':4,'k':3}
print(sorted(d)) 

sorted_by_values= sorted(d,key=lambda x:d[x])
print(sorted_by_values)

1
以下代码对我有效。不确定这有多高效。
sorted_list_by_value=sorted(data_dict, key=data_dict.__getitem__)

-1
from collections import OrderedDict

否则,按照您想要的顺序创建一个键列表。

有序字典(OrderedDict)保留了插入键的顺序,并不按值的大小以递增或递减的顺序存储它们。 - undefined
在旧版本的Python中,字典是明确无序的,所以如果你想对字典进行排序,你需要做类似于OrderedDict(sorted(d,key=lambda x:d[x]))这样的操作。被接受的答案并不是一个"已排序的字典",而是一个已排序的元组可迭代对象。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接