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是否错误?我找不到任何证实这一点的文档。#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]
评论
在CPython 3.7(可能还有更高版本)中,您可能依赖于字典匹配插入顺序的迭代顺序。 mail.python.org/pipermail/python-dev/2017-December/151283.html@BallpointBen在CPython 3.6及更高版本中以及从Python 3.7开始的所有其他Python实现中