python dictionary .keys()和.values()的顺序是否总是相同?

2guxujil  于 2023-08-02  发布在  Python
关注(0)|答案(9)|浏览(148)

字典的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是错误的吗?

ffscu2ro

ffscu2ro1#

找到了这个:
如果调用items()keys()values()iteritems()iterkeys()itervalues()时没有对字典进行任何干预修改,则列表将直接对应。
在2.x文档和3.x文档中。

lhcgjxsq

lhcgjxsq2#

是的,你所观察到的确实是一个有保证的属性--如果dict没有改变,keys()values()items()以全等顺序返回列表。iterkeys() &c也以与相应列表相同的顺序进行迭代。

6pp0gazn

6pp0gazn3#

是的,在Python 2.x中有保证:
如果键、值和项视图在没有对字典进行干预修改的情况下迭代,则项的顺序将直接对应。

ukxgm1gy

ukxgm1gy4#

是的。从CPython 3.6开始,字典将按照插入顺序返回条目。
忽略说这是一个实现细节的部分。CPython 3.6中保证了这种行为,并且对于所有其他Python实现starting with Python 3.7都是required

e5nszbig

e5nszbig5#

有很好的参考资料。以下是您如何保证订单,而不管文档/实现如何:

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

字符串

vwhgwdsa

vwhgwdsa6#

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

to94eoyn

to94eoyn7#

不管怎样,我写的一些大量使用的生产代码都是基于这个假设的,我从来没有遇到过问题。我知道这并不意味着它是真的:-)
如果你不想冒这个险,我会使用ititems()。

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

字符串

neekobn8

neekobn88#

我同意其他人的观点,在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)

字符串
并且输出总是具有相同的顺序,与我输入的顺序完全相同,即,只有脱机服务器将按以下顺序显示:集线器003离线IP:109.251.63.21因为前两个是可访问的
希望能把它弄干净

kcugc4gi

kcugc4gi9#

我对这些答案并不满意,因为我想确保导出的值即使在使用不同的dicts时也具有相同的顺序。
在这里,你预先指定了键的顺序,即使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]

字符串

相关问题