2017-04-07 102 views
0

我想澄清一下Python中的词典的一些观点,这可能会在未来帮助其他Python爱好者。Python:词典以及它们如何用iteritems存储和访问()

让我们从一个简单的字典开始。

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

+0

您的repl可能只是为您排序以便于阅读。另外,foo不是“叫”。你的repl只是显示foo。没有办法“打电话”字典 – acushner

+0

当您显示'foo'时,IPython正在对键进行排序。 – user2357112

回答

1

PEP 372,使用Python 2.7在目前的Python版本,目前广泛使用的内置字典类型不指定存储键/值对的顺序。这使得很难将字典用作某些特定用例的数据存储。

快译通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

+0

所以我认为我看到的这种不一致不仅仅是基于内在的缺乏排序,而且可能是内置的REPL? –

1

权。订单可能会或可能不会达成一致。订购不保证。实施可以自由选择任何顺序方便。换句话说,你上面看到的可能与你从Python获得的顺序不同,然后是Cython,然后是基于LISP的Python等。

事实上,就我目前的安装而言,即使Python 2.7和Python 3.5也有所不同。

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

+0

为了获得更多乐趣,由于哈希随机化,订单可能因同一Python版本的不同运行而有所不同。 – kindall

+0

好的,谢谢你们。这现在更有意义。我认为有几个因素影响我的输出,包括命令不被排序,acchner在他的回复中指出我的REPL,以及我的Python版本。不过,我认为这一切都源于词典不是固有的命令。我可能会使用有序的字典或排序我有 –

相关问题