什么时候应该使用iteritems()而不是items()?

时间:2012-12-21 23:27:25

标签: python python-3.x

在所有地方使用items()代替iteritems()是否合法?为什么从Python 3中删除了iteritems()?看起来像一个了不起的有用的方法。背后的原因是什么?

编辑:为了澄清,我想知道以某种方式以类似生成器的方式(一次一个项目,而不是全部进入内存)迭代字典的正确习惯用法哪个兼容Python 2和Python 3?

7 个答案:

答案 0 :(得分:123)

在Python 2.x中 - .items()返回了一个(键,值)对的列表。在Python 3.x中,.items()现在是一个itemview对象,其行为不同 - 因此具有可以迭代或实现......所以,{{1在Python 2.x中list(dict.items())是必需的。

Python 2.7还有一些用于键处理的后端口,因为你有viewkeysviewitemsviewvalues方法,最有用的是dict.items()其行为更像viewkeys(您期望从set获得)。

简单示例:

dict

将为您提供公共密钥的列表,但同样,在Python 3.x中 - 只需使用common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())

Python 3.x通常被认为更“懒惰” - 即map现在有效itertools.imapzipitertools.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 2python 3的字典文档告诉你的那样,在python 2中items返回一个列表,而iteritems返回一个迭代器。

在python 3中,items返回view,它与迭代器几乎相同。

如果您使用的是python 2,如果您正在处理大型词典,则可能需要用户iteritems,而您想要做的就是迭代这些项目(不一定要将它们复制到列表中)

答案 4 :(得分:5)

正如@Wessie所说,dict.iteritemsdict.iterkeysdict.itervalues(在Python2.x中返回迭代器)以及{{1}在Python3.x中删除了{,{1}}和dict.viewitems(在Python2.x中返回查看对象

dict.viewkeysdict.viewvaluesdict.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)

https://python-future.org/compatible_idioms.html