如何在不使用Ordereddict的情况下按键排序Python字典?

时间:2015-03-21 07:41:05

标签: python sorting dictionary ordereddictionary

开始,这将是一个很好的方式
{2:3, 1:89, 4:5, 2:0}

{1:89, 2:3, 2:0, 3:0} ?

2 个答案:

答案 0 :(得分:3)

首先,你不能在dict中重复键,有序或其他!您有两次密钥2。当创建dict时,这两个值中的一个将立即丢失。

好的,假设所有键都是唯一的。你永远不应该依赖于词典中的项目顺序:

  

CPython实现细节:键和值以非随机的任意顺序列出,在Python实现中各不相同,并且取决于字典的插入和删除历史。

(来自the docs

这就是OrderedDict的原因。在OrderedDict之后,下一个最好的东西是什么?我猜这个:

>>> d = {2:3, 1:89, 4:5, 2:0, 50: 5, 6: 6}

>>> d  # lost "2:3" pair!
{1: 89, 2: 0, 4: 5, 50: 5, 6: 6}

>>> l = d.items()

>>> l
[(1, 89), (2, 0), (4, 5), (50, 5), (6, 6)]

>>> l.sort()

>>> l
[(1, 89), (2, 0), (4, 5), (6, 6), (50, 5)]

这是一个键值对列表。由你负责从中获取值等等。重要的是从不dict(l),因为这可能会改变项目的顺序。即使它似乎工作,也不要这样做! (公平地说:你可以这样做,只是不要依赖于所产生的字典中的项目顺序。或者在任何其他字典中,如上面引用中所述。)

你可以在一个类中实现它,但是你要重新发明OrderedDict类,可能不太好。


出于好奇:为什么你不能使用OrderedDict?

答案 1 :(得分:0)

你要求的东西是不可能的,因为根据定义,字典不是一个线性的东西,就像一个数学集。可能它使用某种树结构实习生,但它如何工作实习生并不重要,可能会改变,并且可能与实现不同。

另一方面,您可以生成字典的有序表示,例如将其打印出来以便向用户显示。一种可能性是使用list tuples。您可以使用dict.items()获取所有字典项的列表。您可以使用list.sort()对列表进行排序。