Python字典:键()和值()总是相同的顺序?

时间:2009-05-07 14:46:13

标签: python

看起来字典的keys()values()方法返回的列表总是一对一的映射(假设字典在调用2种方法之间没有改变)。

例如:

>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
    print d[k[i]] == v[i]

True
True
True

如果您在调用keys()和调用values()之间不改变字典,假设上述for循环将始终打印为True是错误的吗?我找不到任何证明这一点的文件。

8 个答案:

答案 0 :(得分:304)

发现这个:

  

如果items()keys()values(),   iteritems()iterkeys()和。{   调用itervalues()时没有   干预修改   字典,列表将直接   对应。

2.x documentation3.x documentation

答案 1 :(得分:76)

是的,你观察到的确实是一个有保证的属性 - 如果不改变dict,keys(),values()和items()会以全等顺序返回列表。 iterkeys()& c也以与相应列表相同的顺序迭代。

答案 2 :(得分:45)

是的,guaranteed in python 2.x

  

如果迭代了键,值和项视图而没有干预   修改字典,项目的顺序将直接   对应。

答案 3 :(得分:4)

根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects,dict的keys(),values()和items()方法将返回其顺序对应的相应迭代器。但是,我无法找到对python 2.x官方文档的引用。

据我所知,答案是肯定的,但仅限于python 3.0 +

答案 4 :(得分:4)

对于它的价值,我写的一些繁重的生产代码是基于这个假设,我从来没有遇到过问题。我知道这并不是真的: - )

如果您不想承担风险,我会尽量使用iteritems()。

for key, value in myDictionary.iteritems():
    print key, value

答案 5 :(得分:3)

是。从CPython 3.6开始,词典return items in the order you inserted them

忽略说这是实现细节的部分。这种行为在CPython 3.6中得到保证,对于所有其他Python实现required都是starting with Python 3.7

答案 6 :(得分:3)

很好的文档参考。无论文档/实现如何,您都可以通过以下方法保证订单顺序:

k, v = zip(*d.iteritems())

答案 7 :(得分:0)

我对这些答案并不满意,因为即使使用不同的词组,我也希望确保导出的值具有相同的顺序。

在这里,您可以预先指定键顺序,即使dict更改,返回的值也将始终具有相同的顺序,或者您使用不同的dict。

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]