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 。