Python字典:都是keys()和values()总是一样的顺序吗?

它看起来像字典中的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循环将始终打印为真是错误的? 我找不到任何文件证实这一点。

find这个:

如果iteritems() items()keys()values()iteritems()iterkeys()itervalues()而不对字典进行中间修改,则列表将直接对应。

在2.x文档和3.x文档 。

是的,你观察到的确实是一个有保证的属性 – 如果字典没有改变,keys(),values()和items()将返回一致的顺序列表。 iterkeys()&c也以与相应列表相同的顺序进行迭代。

是的,它保证在Python 2.x中 :

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

根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects,dict的keys(),values()和item()方法将返回相应的迭代器,其顺序对应。; 但是,我无法find相同的东西的Python 2.x的官方文档的参考。

所以据我所知,答案是肯定的,但只在python 3.0+

为了什么是值得的,我写的一些重用的生产代码是基于这个假设,我从来没有遇到过问题。 我知道这并不是真的,但:-)

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

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

我不满意这些答案,因为我想要确保导出的值具有相同的顺序,即使使用不同的字典。

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

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

正如已经指出的那样,许多实际的用途将会使它们都被压缩。

 zip(d.keys(), d.values()) 

由于访问顺序保持不变,尽pipe不可预测,所以上面总会返回相同的(键,值)元组。