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

评论

在CPython 3.7(可能还有更高版本)中,您可能依赖于字典匹配插入顺序的迭代顺序。 mail.python.org/pipermail/python-dev/2017-December/151283.html

@BallpointBen在CPython 3.6及更高版本中以及从Python 3.7开始的所有其他Python实现中

#1 楼

发现了以下内容:


如果items()keys()values()
iteritems()iterkeys()
itervalues()被调用而没有
对应。


在2.x文档和3.x文档中。

评论


显然,3.x文档中的语句更加清晰:“项目的顺序将直接对应”

–李少华
16年5月8日在3:49



3.7文档中缺少此文本。我只能假设是因为3.7中的“词典保持插入顺序”:mail.python.org/pipermail/python-dev/2017-December/151283.html

– EliadL
19年1月23日在16:40

#2 楼

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

评论


但是,如果列表发生更改,Pandas数据框提供了一种替代方案,可以更新或删除项目,并且在类似dict的结构中,项目的顺序和索引位置保持不变。

–维尔
19年3月18日在1:40

#3 楼

是的,它在python 2.x中是可以保证的:
对应。


#4 楼

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

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

#5 楼

对文档的良好引用。不管文档/实现如何,都可以通过以下方法保证订购:

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


评论


在python3.x中,使用dict.items()

–善意
19年3月28日在20:14

#6 楼

根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects,字典的keys(),values()和items()方法将返回其顺序的相应迭代器对应。但是,对于同一件事,我无法找到python 2.x官方文档的引用。据我所知,答案是肯定的,但仅限于python 3.0+

#7 楼

就其价值而言,我编写的一些常用的生产代码都基于此假设,但我从未遇到过任何问题。我知道这并不是真的:-)

如果您不想冒险,我会尽可能使用iteritems()。

for key, value in myDictionary.iteritems():
    print key, value


#8 楼

我对这些答案不满意,因为我想确保即使使用不同的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]