items()
在所有地方使用而不是在所有地方使用是否合法iteritems()
?为什么iteritems()
从 Python 3 中移除?似乎是一个了不起和有用的方法。背后的原因是什么?
编辑:为了澄清,我想知道以与 Python 2 和 Python 3 兼容的方式以类似生成器的方式(一次一个项目,而不是全部进入内存)迭代字典的正确习惯用法是什么?
items()
在所有地方使用而不是在所有地方使用是否合法iteritems()
?为什么iteritems()
从 Python 3 中移除?似乎是一个了不起和有用的方法。背后的原因是什么?
编辑:为了澄清,我想知道以与 Python 2 和 Python 3 兼容的方式以类似生成器的方式(一次一个项目,而不是全部进入内存)迭代字典的正确习惯用法是什么?
在 Python 2.x 中 -.items()
返回 (key, value) 对的列表。在 Python 3.x 中,.items()
现在是一个itemview
对象,它的行为不同 - 所以它必须被迭代或物化......所以,对于Python 2.x 中list(dict.items())
的内容是必需的。dict.items()
Python 2.7 也有一些用于密钥处理的后端端口,因为你有viewkeys
,viewitems
和viewvalues
方法,最有用的是viewkeys
它的行为更像 a set
(你希望从 a 中得到它dict
)。
简单的例子:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
会给你一个公共键的列表,但同样,在 Python 3.x 中 - 只是使用.keys()
。
Python 3.x 通常变得更加“懒惰”——即map
现在是有效的itertools.imap
,zip
是的itertools.izip
,等等。
dict.iteritems
被删除是因为dict.items
现在dict.iteritems
在 python 2.x 中做了这件事,甚至通过使它成为一个itemview
.
这六个库有助于编写与 python 2.5+ 和 python 3 兼容的代码。它有一个 iteritems 方法,可以在 python 2 和 3 中工作。示例:
import six
d = dict( foo=1, bar=2 )
for k, v in six.iteritems(d):
print(k, v)
正如python 2和python 3的字典文档会告诉你的那样,在 python 2 中items
返回一个列表,而iteritems
返回一个迭代器。
在 python 3 中,items
返回一个view,它与迭代器几乎相同。
如果您使用的是 python 2,如果您正在处理大型字典,您可能想要 useriteritems
并且您想要做的就是迭代项目(不一定将它们复制到列表中)
正如@Wessie 所指出的,dict.iteritems
,dict.iterkeys
和dict.itervalues
(在 Python2.x 中返回迭代器)以及dict.viewitems
,dict.viewkeys
和dict.viewvalues
(在 Python2.x 中返回视图对象)都在 Python3.x 中被删除
和dict.items
, dict.keys
anddict.values
用于在 Python2.x 中返回字典列表的副本,现在在 Python3.x 中返回视图对象,但它们仍然与迭代器不同。
如果要在 Python3.x中返回迭代器iter(dictview)
,请使用:
$ python3.3
>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>
你不能在 Python 的所有地方都items
使用它。iteritems
例如,下面的代码:
class C:
def __init__(self, a):
self.a = a
def __iter__(self):
return self.a.iteritems()
>>> c = C(dict(a=1, b=2, c=3))
>>> [v for v in c]
[('a', 1), ('c', 3), ('b', 2)]
如果你使用会打破items
:
class D:
def __init__(self, a):
self.a = a
def __iter__(self):
return self.a.items()
>>> d = D(dict(a=1, b=2, c=3))
>>> [v for v in d]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __iter__ returned non-iterator of type 'list'
viewitems也是如此,它在 Python 3 中可用。
此外,由于items返回字典对列表的副本(key, value)
,因此效率较低,除非您无论如何都想创建副本。
在 Python 2 中,最好使用iteritems
迭代。如果您决定升级到 Python 3,该2to3
工具可以替换它。items
future.utils
允许 python 2 和 3 的兼容性。
# Python 2 and 3: option 3
from future.utils import iteritems
heights = {'man': 185,'lady': 165}
for (key, value) in iteritems(heights):
print(key,value)
>>> ('lady', 165)
>>> ('man', 185)