Python字典中:keys()和values()输出的顺序总是相同的吗?

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

122466 次浏览

是的,你观察到的确实是一个有保证的属性——keys()values()items()在字典没有改变的情况下以一致的顺序返回列表。iterkeys() &c也以相同的顺序迭代对应的列表。

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

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

是的,它是在python 2.x中保证:

如果键,值和项视图被迭代,没有干预 修改后的字典,条目的顺序将直接改变 对应。< / p >

不管怎样,我编写的一些大量使用的产品代码就是基于这个假设,而且我从来没有遇到过问题。我知道这并不是真的:-)

如果你不想冒这个风险,我可以使用iteritems()。

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

发现了这个:

如果items()keys()values()iteritems()iterkeys(),和 itervalues()使用no调用 干预性修改 字典,列表将直接 对应。< / p >

2.x文档3.x文档上。

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

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

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实现从Python 3.7开始,此行为为要求

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

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

我同意其他人的观点,在python 3.6+中,如果不受用户影响,它应该保持不变。

几天前我的代码中的一个例子:

ips = { '001' : '199.250.178.14', '002' : '199.18.2.89', '003' : '109.251.63.21' }
def run(self):
for x, y in self.ips.items():
try:
subprocess.check_call(
['ping', '-n', '1', y],
stdout=DEVNULL,  # suppress output
stderr=DEVNULL
)
except subprocess.CalledProcessError:
nextServer = ('HUB ' + x + ' is OFFLINE   ' + " IP:   " + y)

和输出总是相同的顺序,与我输入的完全一样,即只有离线服务器才会按顺序显示: HUB 003为OFFLINE IP: 109.251.63.21 因为前两个是可达的

希望能把它清除掉