Python:字典以及如何使用iteritems()存储和访问字典

Python:字典以及如何使用iteritems()存储和访问字典,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我想澄清一些关于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.ite

我想澄清一些关于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()
(两者给出相同的结果)在字典上循环时,我的困惑就出现了

此输出顺序与我在
foo
中输入键/值的顺序或调用
foo
时的输出方式不一致

这是否与
foo.iteritems()
如何生成其键/值或其他内容有关

我在Ubuntu上使用Python 2.7,因为在当前的Python版本中,广泛使用的内置dict类型没有指定存储的键/值对的顺序。这使得很难将字典用作某些特定用例的数据存储

Python中的Dict没有任何顺序:)对于这种用法,可以使用
collections.orderedict
如下:

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

您可以阅读有关

右侧的内容。这些命令可能一致,也可能不一致。订购不保证。实现可以自由选择任何方便的顺序。换句话说,您在上面看到的可能与您从Python、Cython、以及基于LISP的Python等获得的顺序不同

事实上,在我当前的安装中,即使是Python2.7和Python3.5也有所不同


如果需要订单,请使用OrderedDict对象。如果您只是对实现感兴趣,我建议您查找特定实现的文档。

您的repl可能只是为了便于阅读而对其进行排序。此外,foo没有被“调用”。您的repl只是显示foo。没有办法“调用”字典。Python在显示
foo
时会对键进行排序。因此,我认为我看到的这种不一致性不仅是由于固有的缺乏排序,还可能是由于REPL内置的,以增加乐趣,由于散列随机化,同一Python版本的不同运行之间的顺序可能不同。好的,谢谢大家。现在这更有意义了。我认为有几个因素会影响我的输出,包括dicts没有被排序、acushner在回复中指出的REPL以及我的Python版本。然而,我认为这一切都源于这样一个事实:字典并不是天生有序的。我可能会使用有序字典或对我有的字典进行排序
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