我想澄清Python中有关字典的一些观点,这可能会对未来的其他Python爱好者有所帮助。
让我们从一个简单的字典开始。
foo = {'a_2': 4, 'b_2': 5, 'a_1': 2, 'b_1': 1}
并显示foo
,
In [31]: foo
Out[31]: {'a_1': 2, 'a_2': 4, 'b_1': 1, 'b_2': 5}
可以看出,foo
似乎是“无序的”。但是,在进一步阅读后,我发现字典本身并不是有序的,显示字典时的输出只是基于键的哈希值。
当我使用foo.iteritems()
或foo.items()
循环字典时,我的困惑就出现了(两者都给出相同的结果。)
for k, v in foo.iteritems():
print '{}: {}'.format(k, foo[k])
b_1: 1
b_2: 5
a_2: 4
a_1: 2
此输出排序与我输入foo
中的键/值的顺序或调用foo
时的输出方式不一致。
这是否与foo.iteritems()
如何生成其键/值或其他内容有关?
我在Ubuntu上使用Python 2.7
答案 0 :(得分:1)
根据PEP 372,在当前的Python版本中,广泛使用的内置dict类型没有指定存储的键/值对的顺序。这使得很难将字典用作某些特定用例的数据存储。
Python中的词典没有任何顺序:)对于这种用法,您可以像这样使用collections.OrderedDict
:
foo = {'a_2': 4, 'b_2': 5, 'a_1': 2, 'b_1': 1}
import collections
order = collections.OrderedDict(foo)
for k,v in order.items():
print k,v
您可以阅读OrderedDict
答案 1 :(得分:1)
右。订单可能会也可能不会达成一致。订购无法保证。实现可以自由选择任何方便的订单。换句话说,你在上面看到的可能与你从Python获得的顺序不同,然后是Cython,然后是基于LISP的Python等。
事实上,在我目前的安装中,即使Python 2.7和Python 3.5也不同。
如果您需要订单,请使用OrderedDict对象。如果您只是对实现感到好奇,我建议您找到适合您特定实现的文档。