Python dictionary: are keys() and values() always the same order?
似乎字典的
例如:
1 2 3 4 5 6 7 8 | >>> 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 |
如果在调用
找到这个:
If
items() ,keys() ,values() ,
iteritems() ,iterkeys() , and
itervalues() are called with no
intervening modifications to the
dictionary, the lists will directly
correspond.
号
2.x文档和3.x文档。
是的,您所观察到的确实是一个有保证的属性——keys()、values()和items()如果dict没有更改,则按一致顺序返回列表。iterkeys()&c也以与相应列表相同的顺序迭代。
是的,它在python 2.x中有保证:
If keys, values and items views are iterated over with no intervening
modifications to the dictionary, the order of items will directly
correspond.
号
就其价值而言,我编写的一些大量使用的生产代码是基于这个假设的,我从来没有对它有过任何问题。但我知道这并不能证明这一点:—)
如果你不想冒这个险,我可以用ITeritems()。
1 2 | for key, value in myDictionary.iteritems(): print key, value |
根据http://docs.python.org/dev/py3k/library/stdtypes.html dictionary视图对象,dict的keys()、values()和items()方法将返回其顺序对应的迭代器。但是,我找不到对Python2.x的官方文档的引用。
据我所知,答案是肯定的,但只有在python 3.0中+
很好的参考文件。以下是无论文档/实现如何,您都可以保证订单:
1 | k, v = zip(*d.iteritems()) |
对。从CPython3.6开始,字典按插入顺序返回项目。
忽略表示这是实现细节的部分。这种行为在CPython3.6中得到了保证,并且对于从Python3.7开始的所有其他Python实现都是必需的。
我对这些答案不满意,因为我想确保导出的值在使用不同的dict时具有相同的顺序。
在这里,您预先指定键顺序,返回的值将始终具有相同的顺序,即使dict更改,或者使用不同的dict。
1 2 3 | keys = dict1.keys() ordered_keys1 = [dict1[cur_key] for cur_key in keys] ordered_keys2 = [dict2[cur_key] for cur_key in keys] |
号