看起来字典的keys()和values()方法返回的列表总是1对1的映射(假设在调用这两个方法之间字典没有改变)。

例如:

>>> 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是错误的吗?我找不到任何证明这一点的文件。


当前回答

发现了这个:

如果items() keys() values() Iteritems()、iterkeys()和 Itervalues()使用no调用 干预性修改 字典,列表将直接 对应。

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

其他回答

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

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

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

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

是的。从CPython 3.6开始,字典会按照插入的顺序返回项。

忽略说这是一个实现细节的部分。这种行为在CPython 3.6中得到了保证,并且从Python 3.7开始的所有其他Python实现都需要这种行为。

很好的文档参考。以下是你如何保证不管文档/实现的顺序:

k, v = zip(*d.iteritems())

根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects, dict的keys(), values()和items()方法将返回顺序对应的迭代器。但是,我找不到python 2的官方文档。X表示相同的东西。

所以就我所知,答案是肯定的,但仅限于python 3.0+