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 ,因为你有viewkeysviewitemsviewvalues方法,最有用的是viewkeys ,它的行为更像一个set (你可以从dict )。

简单的例子:

 common_keys = list(dict_a.viewkeys() & dict_b.viewkeys()) 

会给你一个通用键的列表,但在Python 3.x中再次使用.keys()来代替。

Python 3.x通常被做成更“懒惰” – 也就是说,现在map是有效的itertools.imapzipitertools.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.iteritemsdict.iterkeysdict.itervalues (在Python2.x中返回一个迭代器 )以及dict.viewitemsdict.viewkeysdict.viewvalues (它们返回Python2.x中的视图对象 )都在Python3.x中被删除

在Python2.x中用于返回字典列表副本dict.itemsdict.keysdict.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