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不可预测,所以上面总会返回相同的(键,值)元组。