字典的keys()
和values()
方法返回的列表看起来总是一对一的Map(假设字典在调用这两个方法之间没有改变)。
举例来说:
>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> k, v = list(d.keys()), list(d.values())
>>> for i in range(len(k)):
... print(d[k[i]] == v[i])
...
True
True
True
字符串
如果在调用keys()
和调用values()
之间不改变字典,那么假设上面的for循环总是打印True是错误的吗?
9条答案
按热度按时间ffscu2ro1#
找到了这个:
如果调用
items()
、keys()
、values()
、iteritems()
、iterkeys()
和itervalues()
时没有对字典进行任何干预修改,则列表将直接对应。在2.x文档和3.x文档中。
lhcgjxsq2#
是的,你所观察到的确实是一个有保证的属性--如果dict没有改变,
keys()
、values()
和items()
以全等顺序返回列表。iterkeys()
&c也以与相应列表相同的顺序进行迭代。6pp0gazn3#
是的,在Python 2.x中有保证:
如果键、值和项视图在没有对字典进行干预修改的情况下迭代,则项的顺序将直接对应。
ukxgm1gy4#
是的。从CPython 3.6开始,字典将按照插入顺序返回条目。
忽略说这是一个实现细节的部分。CPython 3.6中保证了这种行为,并且对于所有其他Python实现starting with Python 3.7都是required。
e5nszbig5#
有很好的参考资料。以下是您如何保证订单,而不管文档/实现如何:
字符串
vwhgwdsa6#
根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects,dict的keys(),values()和items()方法将返回顺序对应的相应迭代器。然而,我无法找到python 2.x的官方文档的引用。
所以就我所知,答案是肯定的,但仅限于python3.0 +
to94eoyn7#
不管怎样,我写的一些大量使用的生产代码都是基于这个假设的,我从来没有遇到过问题。我知道这并不意味着它是真的:-)
如果你不想冒这个险,我会使用ititems()。
字符串
neekobn88#
我同意其他人的观点,在python 3.6+中,如果不受用户的影响,它应该保持不变。
下面是我几天前写的代码:
字符串
并且输出总是具有相同的顺序,与我输入的顺序完全相同,即,只有脱机服务器将按以下顺序显示:集线器003离线IP:109.251.63.21因为前两个是可访问的
希望能把它弄干净
kcugc4gi9#
我对这些答案并不满意,因为我想确保导出的值即使在使用不同的dicts时也具有相同的顺序。
在这里,你预先指定了键的顺序,即使dict改变了,或者你使用了不同的dict,返回的值也总是有相同的顺序。
字符串