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

Python字典:key()和values()的顺序总是一样的吗?,python,Python,字典的keys()和values()方法返回的列表看起来总是一对一的映射(假设字典在调用这两个方法之间没有改变) 例如: >>> 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()和调用val

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

例如:

>>> 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是否错误?我找不到任何文档来证实这一点。

是的,您观察到的确实是一个有保证的属性--
keys()
values()
items()
如果不更改dict,则以一致的顺序返回列表
iterkeys()
&c也会按照与相应列表相同的顺序进行迭代。

根据,dict的keys()、values()和items()方法将返回顺序对应的相应迭代器。但是,我找不到关于Python2.x的官方文档的参考

据我所知,答案是肯定的,但只有在python 3.0+中才是肯定的:

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


值得一提的是,我编写的一些大量使用的生产代码是基于这个假设的,我从来没有遇到过问题。但我知道这并不能使它成为现实:-)

如果你不想冒险,如果可以的话,我会使用iteritems()

for key, value in myDictionary.iteritems():
    print key, value
我们发现:

如果
项()
键()
值()
iteritems()
iterkeys()
,以及
itervalues()
调用时没有 干预对程序的修改 字典,列表将直接显示 对应


关于和。

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

在这里,您预先指定键顺序,即使dict发生更改,或者使用不同的dict,返回的值也将始终具有相同的顺序

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

对。从CPython3.6开始,字典


忽略说明这是实现细节的部分。这种行为在CPython 3.6中得到保证,并且适用于所有其他Python实现

很好的文档参考资料。以下是您如何在不考虑文档/实施的情况下保证订单:

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

显然,3.x文档中的陈述更为清晰:“项目顺序将直接对应”此文本在3.7文档中缺失。我只能假设这是因为3.7中的“Dict保持插入顺序”:在CPython 3.7(以及更高版本)中,您可能依赖字典的迭代顺序来匹配插入顺序@BallpointBen它在CPython 3.6及以上版本中,以及从Python 3.7开始的所有其他Python实现中,但是,如果列表发生更改,Pandas
dataframe
提供了一种替代方法,可以在其中更新或删除项,并且类似dict结构中项的顺序和索引位置保持不变。在python3.x中,使用dict.items()