从
开始,这将是一个很好的方式{2:3, 1:89, 4:5, 2:0}
到
{1:89, 2:3, 2:0, 3:0} ?
答案 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()
对列表进行排序。