问题:什么时候应使用iteritems()代替items()?
items()
代替iteritems()
在所有地方使用是否合法?为什么iteritems()
从Python 3 中删除?似乎是一种了不起的,有用的方法。它背后的原因是什么?
编辑:为澄清起见,我想知道以类似于生成器的方式(一次将一项,而不是全部都存储到内存中)以与Python 2和Python 3兼容的方式遍历字典的正确习惯是什么。 ?
回答 0
在Python 2.x中- itemview
对象,它的行为有所不同-因此必须对其进行迭代或实例化…因此,list(dict.items())
对于dict.items()
Python 2.x中的对象来说,这是必需的。
Python 2.7版也有一个有点背口密钥处理的,在你有viewkeys
,其表现更像是一个set
(你想从预期dict
)。
简单的例子:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
会为您提供常见键的列表,但是同样,在Python 3.x中-只需使用即可.keys()
。
通常使Python 3.x更加“懒惰”-即map
现在有效itertools.imap
,zip
is itertools.izip
等等。
回答 1
dict.iteritems
之所以被删除是因为dict.items
现在它dict.iteritems
在python 2.x中做了,甚至通过将它变成了itemview
。
回答 2
六个库有助于编写与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)
回答 3
就像python 2和python 3的字典文档会告诉您的那样,在python 2中items
返回一个列表,而iteritems
返回一个迭代器。
在python 3中,items
返回view,它与迭代器几乎相同。
如果您使用的是python 2,则可能需要iteritems
使用大型字典,而您要做的就是遍历所有项目(不必将它们复制到列表中)
回答 4
正如@Wessie指出的,dict.iteritems
,dict.iterkeys
和dict.itervalues
(它返回一个迭代中Python2.x)以及dict.viewitems
,dict.viewkeys
和dict.viewvalues
(其返回查看对象中Python2.x)均在Python3.x除去
和dict.items
,dict.keys
并且dict.values
曾经用于在Python2.x中返回字典列表的副本,现在返回了Python3.x中的视图对象,但是它们仍然与iterator并不相同。
如果要在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'>
回答 5
不能使用items
,而不是iteritems
在所有的Python的地方。例如,以下代码:
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中可用。
同样,由于项返回字典对列表的副本(key, value)
,因此效率较低,除非您仍然要创建副本。
在Python 2中,最好iteritems
用于迭代。如果您决定升级到Python 3,2to3
可以用该工具替换items
。
回答 6
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)