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

Python dictionary: are keys() and values() always the same order?

似乎字典的keys()values()方法返回的列表始终是1对1的映射(假设在调用2个方法之间字典没有改变)。

例如:

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

如果在调用keys()和调用values()之间不更改字典,那么假设上面的for循环始终打印为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]