在所有地方使用items()
代替iteritems()
是否合法?为什么从Python 3中删除了iteritems()
?看起来像一个了不起的有用的方法。背后的原因是什么?
编辑:为了澄清,我想知道以某种方式以类似生成器的方式(一次一个项目,而不是全部进入内存)迭代字典的正确习惯用法哪个兼容Python 2和Python 3?
答案 0 :(得分:123)
在Python 2.x中 - .items()
返回了一个(键,值)对的列表。在Python 3.x中,.items()
现在是一个itemview
对象,其行为不同 - 因此具有可以迭代或实现......所以,{{1在Python 2.x中list(dict.items())
是必需的。
Python 2.7还有一些用于键处理的后端口,因为你有viewkeys
,viewitems
和viewvalues
方法,最有用的是dict.items()
其行为更像viewkeys
(您期望从set
获得)。
简单示例:
dict
将为您提供公共密钥的列表,但同样,在Python 3.x中 - 只需使用common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
。
Python 3.x通常被认为更“懒惰” - 即map
现在有效itertools.imap
,zip
是itertools.izip
等等。
答案 1 :(得分:79)
dict.iteritems
已删除,因为dict.items
现在执行dict.iteritems
在python 2.x中执行的操作,甚至通过将其设为itemview
来改进它。
答案 2 :(得分:56)
The six library有助于编写与python 2.5+和python 3兼容的代码。它有一个iteritems方法,可以在python 2和3中使用。例如:
from __future__ import division, absolute_import, print_function, unicode_literals
import six
d = dict( foo=1, bar=2 )
for k, v in six.iteritems(d):
print(k, v)
答案 3 :(得分:7)
正如python 2和python 3的字典文档告诉你的那样,在python 2中items
返回一个列表,而iteritems
返回一个迭代器。
在python 3中,items
返回view,它与迭代器几乎相同。
如果您使用的是python 2,如果您正在处理大型词典,则可能需要用户iteritems
,而您想要做的就是迭代这些项目(不一定要将它们复制到列表中)
答案 4 :(得分:5)
正如@Wessie所说,dict.iteritems
,dict.iterkeys
和dict.itervalues
(在Python2.x中返回迭代器)以及{{1}在Python3.x中删除了{,{1}}和dict.viewitems
(在Python2.x中返回查看对象)
dict.viewkeys
,dict.viewvalues
和dict.items
用于返回Python2.x中字典列表的副本,现在返回查看对象在Python3.x中,但它们仍然与迭代器不同。
如果要在Python3.x中返回迭代器,请使用iter(dictview)
:
dict.keys
答案 5 :(得分:5)
您无法在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'
{3}}也是如此,它在Python 3中可用。
此外,由于viewitems会返回字典(key, value)
对列表的副本,因此效率较低,除非您想创建副本。
在Python 2中,最好使用iteritems
进行迭代。如果您决定升级到Python 3,2to3
工具可以用items
替换它。
答案 6 :(得分:0)
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)