Python:字典以及如何使用iteritems()

时间:2017-04-07 22:12:25

标签: 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.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

2 个答案:

答案 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对象。如果您只是对实现感到好奇,我建议您找到适合您特定实现的文档。