Python中的iteritems
在所有地方使用items()
而不是iteritems()
是否合法? 为什么iteritems()
从Python 3中删除? 看起来像一个了不起的和有用的方法。 它背后的理由是什么?
编辑:为了澄清,我想知道什么是正确的习惯用类似发电机的方式迭代字典(一次一个,而不是全部到内存中)以兼容Python 2和Python 3的方式?
在Python 2.x中, .items()
返回(key,value)对的列表。 在Python 3.x中, .items()
现在是一个itemview
对象,它的行为是不同的 – 所以它必须被迭代,或物化…因此, list(dict.items())
是dict.items()
所必需的dict.items()
Python 2.x中的dict.items()
Python 2.7对于密钥处理也有一些viewkeys
,因为你有viewkeys
, viewitems
和viewvalues
方法,最有用的是viewkeys
,它的行为更像一个set
(你可以从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和Python 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)
由于python 2和python 3的字典文档会告诉你,在Python 2中, items
返回一个列表,而iteritems
返回一个迭代器。
在Python 3中, items
返回一个视图 ,这几乎是一个迭代器相同。
如果你正在使用Python 2,你可能想要用户iteritems
如果你正在处理大型词典,你想要做的是迭代的项目(不一定复制到列表)
就像@Wessie指出的那样, dict.iteritems
, dict.iterkeys
和dict.itervalues
(在Python2.x中返回一个迭代器 )以及dict.viewitems
, dict.viewkeys
和dict.viewvalues
(它们返回Python2.x中的视图对象 )都在Python3.x中被删除
在Python2.x中用于返回字典列表副本的dict.items
, dict.keys
和dict.items
现在可以在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
而不是items
。 例如,下面的代码:
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)
对列表的副本,效率较低,除非您想要创build副本。
在Python 2中,最好使用iteritems
进行迭代。 如果您决定升级到Python 3,则2to3
工具可以将其replace为items
。