字典会按相同顺序返回键和值吗?
如果我在 Python 中有一个字典,调用 .keys 和 .values 会返回对应的元素,顺序会一样吗?
举个例子:
foo = {'foobar' : 1, 'foobar2' : 4, 'kittty' : 34743}
对于键,它返回:
>>> foo.keys()
['foobar2', 'foobar', 'kittty']
那么 foo.values() 会总是以和对应的键一样的顺序返回元素吗?
3 个回答
来自Python 2.6的文档:
字典里的键(key)和值(value)是以一种不随机的顺序列出的,这个顺序不是固定的,会根据不同的Python版本而变化,还和字典的插入和删除历史有关。如果在没有对字典进行任何修改的情况下调用
items()
、keys()
、values()
、iteritems()
、iterkeys()
和itervalues()
,那么返回的列表会直接对应。这就允许我们使用zip()
来创建(值,键)对,比如pairs = zip(d.values(), d.keys())
。对于iterkeys()
和itervalues()
方法也是一样的关系:pairs = zip(d.itervalues(), d.iterkeys())
也会得到相同的值对。另一种创建相同列表的方法是pairs = [(v, k) for (k, v) in d.iteritems()]
。
我几乎可以肯定,Python 3.0 也会有相同的情况。
是的,它们会这样做。
你可以查看这个文档,地址是 Python文档:
字典中的键和值是以一种不随机的顺序列出的,这个顺序在不同的Python版本中可能会有所不同,并且还和字典的插入和删除历史有关。如果在没有对字典进行任何修改的情况下调用items()、keys()、values()、iteritems()、iterkeys()和itervalues(),那么返回的列表将会直接对应。
最好的做法还是使用 dict.items()。
要提升对Python文档的理解其实挺难的:
字典里的键和值是以一种非随机的顺序列出的,这个顺序不是固定的,会根据不同的Python版本而变化,并且还和字典的插入和删除历史有关。如果在没有对字典进行任何修改的情况下调用
items()
、keys()
、values()
、iteritems()
、iterkeys()
和itervalues()
,那么得到的列表是直接对应的。这就允许我们使用zip()
来创建(值, 键)
的配对,比如pairs = zip(d.values(), d.keys())
。同样的关系也适用于iterkeys()
和itervalues()
方法:pairs = zip(d.itervalues(), d.iterkeys())
也会得到相同的配对。还有一种创建相同列表的方法是pairs = [(v, k) for (k, v) in d.iteritems()]
所以,总的来说,答案是“是的”,但要注意,在调用keys()
和values()
之间,不能对字典进行修改。