为什么字典值不在插入的顺序中?

时间:2011-05-19 15:52:02

标签: python dictionary sequence

当我宣布一个列表1,2,3,4并且我对它做了一些事情,即使只是打印我也会得到相同的序列1,2,3,4。

但是当我对字典做任何事情时,它们总是会改变数字序列,就像它以一种我无法理解的扭曲方式排序。

test1 = [4,1,2,3,6,5]
print test1
test2 = {"c":3,"a":1,"b":2,"d":4}
print test2 

[4, 1, 2, 3, 6, 5]
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

世界如何'a'成为第一个元素和'c',即使按字母顺序对字典进行排序,它应该是1,2,3,4或a,b,c,d不是1,3 ,2,4。 wT?F @!$!@ $#@!

那么我如何打印,从字典中获取值而不改变元素的位置。?

6 个答案:

答案 0 :(得分:12)

Python中的词典按定义无序排序。如果您需要插入值的顺序(在Python 2.7和3.x中可用),请使用OrderedDict

答案 1 :(得分:2)

字典排序顺序未定义!不要依赖它。如果你真的想要一个排序的字典,那就找一个排序的字典,但通常你不需要一个。

示例:

  • python 2.7,它内置于集合模块
  • Django附带了一个SortedDict
  • 2.4-2.7你可以使用ordereddict模块,你可以pip install或easy_install它

答案 2 :(得分:2)

在你生气和沮丧之前,也许你应该读一下字典究竟是什么以及它是如何运作的:

http://docs.python.org/library/stdtypes.html#mapping-types-dict

Python dicts使用哈希表作为底层存储机制。这意味着从您提供的密钥生成散列密钥。无法保证使用这些哈希键进行排序。当您请求values(),keys()或items()时,字典中的条目按其在底层哈希表中的位置的顺序提取。

使用哈希表的优点是它非常快。与使用红黑树存储机制( 按原始键排序)的c ++中的map类不同,哈希表不需要经常重构以保持其效率。有关哈希表的更多信息,请参阅:

http://en.wikipedia.org/wiki/Hash_table

就像其他海报所说的那样,如果你需要一个按键排序的字典,请查看OrderedDict。

祝你好运!

答案 3 :(得分:1)

显然你知道列表。您可以在列表的第i个索引处请求元素。这是因为列表是有序的。

>>> [1,2,3,4] == [1,4,3,2]
False

在这种情况下,您可以考虑字典,但索引是关键。因此,如果两个字典中的所有键的对应值相同(如果一个字典具有另一个不具有的键,那么这两个不相等),则两个字典是相等的。因此:

>>> {1:'a', 2:'b'} == {2:'b', 1:'a'}
True

进一步琐事

字典在字典的键上执行名为hashing的操作,这样当您在特定键(索引)处请求值时,它可以更快地检索此值。

希望这有帮助

答案 4 :(得分:0)

字典未分类。这是有据可查的。不要依赖词典的排序。

答案 5 :(得分:0)

如果您想按顺序查看条目。类似的东西:

test2 = {"c":3,"a":1,"b":2,"d":4}
ks = test2.keys()
ks.sort()
for key in ks:
   print key + ':' + str(test2[key])

(切,糊,季节)