问题:Python字典:keys()和values()总是相同的顺序吗?
看起来字典的keys()
和values()
方法返回的列表始终是一对一映射(假设在调用这两种方法之间字典没有改变)。
例如:
>>> 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是否错误?我找不到任何证明文件。
回答 0
发现了这一点:
如果
items()
,keys()
,values()
,iteritems()
,iterkeys()
,和itervalues()
被称为中间没有修改的字典,列表会直接对应。
回答 1
是的,您观察到的确实是一个有保证的属性-如果未更改dict,则keys(),values()和items()会以一致的顺序返回列表。iterkeys()&c也以与相应列表相同的顺序进行迭代。
回答 2
是的,在python 2.x中可以保证:
如果对键,值和项目视图进行了迭代而没有对字典进行任何中间修改,则项目的顺序将直接对应。
回答 3
是。从CPython 3.6开始,字典按插入顺序返回项目。
忽略说这是实现细节的部分。此行为在CPython 3.6中得到保证,并且从Python 3.7开始的所有其他Python实现都需要此行为。
回答 4
对文档的良好引用。无论文档/实现如何,都可以通过以下方法保证订单的准确性:
k, v = zip(*d.iteritems())
回答 5
根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects,dict的keys(),values()和items()方法将返回其顺序的相应迭代器对应。但是,对于同一件事,我无法找到python 2.x官方文档的引用。
据我所知,答案是肯定的,但仅适用于python 3.0+
回答 6
就其价值而言,我编写的一些常用的生产代码都基于此假设,但我从未遇到过任何问题。我知道那不是真的:-)
如果您不想冒险,我会尽可能使用iteritems()。
for key, value in myDictionary.iteritems():
print key, value
回答 7
我对这些答案不满意,因为我想确保即使使用不同的字典,导出的值也具有相同的顺序。
在这里,您可以预先指定键顺序,即使字典更改,返回的值也将始终具有相同的顺序,或者您使用不同的字典。
keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]