为什么字典值不是按插入顺序?
当我声明一个列表,比如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。这到底是怎么回事啊!
那么我该怎么做才能从字典中打印或获取值,而不改变元素的位置呢?
6 个回答
在你感到生气和沮丧之前,也许你应该先了解一下字典到底是什么,以及它是怎么工作的:
http://docs.python.org/library/stdtypes.html#mapping-types-dict
Python中的字典使用哈希表作为底层存储方式。这意味着你提供的键会生成一个哈希键。使用这些哈希键时,不能保证它们的顺序。当你请求值(values())、键(keys())或项目(items())时,字典中的条目是按照它们在哈希表中的位置顺序取出的。
使用哈希表的好处是速度非常快。与C++中的map类使用红黑树存储机制(这个是按原始键排序的)不同,哈希表不需要不断重组来保持高效。想了解更多关于哈希表的内容,可以查看:
http://en.wikipedia.org/wiki/Hash_table
就像其他人说的,如果你需要一个按键排序的字典,可以查查OrderedDict。
祝你好运!
字典的排序顺序是没有定义的!所以不要依赖它来做任何事情。如果你真的需要一个有序的字典,可以找一个专门的有序字典,但通常情况下你并不需要这样。
举几个例子:
- 在 Python 2.7 中,有一个内置的有序字典在 collections 模块里。
- Django 框架里也有一个叫 SortedDict 的有序字典。
- 在 Python 2.4 到 2.7 之间,你可以使用 ordereddict 模块,可以通过 pip 安装或者 easy_install 来获取。
在Python中,字典是没有顺序的。如果你需要保持插入值的顺序,可以使用OrderedDict
(这个在Python 2.7和3.x版本中都可以用)。