167

items()在所有地方使用而不是在所有地方使用是否合法iteritems()?为什么iteritems()从 Python 3 中移除?似乎是一个了不起和有用的方法。背后的原因是什么?

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

4

7 回答 7

158

在 Python 2.x 中 -.items()返回 (key, value) 对的列表。在 Python 3.x 中,.items()现在是一个itemview对象,它的行为不同 - 所以它必须被迭代或物化......所以,对于Python 2.x 中list(dict.items())的内容是必需的。dict.items()

Python 2.7 也有一些用于密钥处理的后端端口,因为你有viewkeys,viewitemsviewvalues方法,最有用的是viewkeys它的行为更像 a set(你希望从 a 中得到它dict)。

简单的例子:

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

会给你一个公共键的列表,但同样,在 Python 3.x 中 - 只是使用.keys()

Python 3.x 通常变得更加“懒惰”——即map现在是有效的itertools.imapzip是的itertools.izip,等等。

于 2012-12-21T23:31:48.193 回答
108

dict.iteritems被删除是因为dict.items现在dict.iteritems在 python 2.x 中做了这件事,甚至通过使它成为一个itemview.

于 2012-12-21T23:29:17.047 回答
66

这六个库有助于编写与 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)
于 2014-08-01T14:27:50.503 回答
12

正如python 2python 3的字典文档会告诉你的那样,在 python 2 中items返回一个列表,而iteritems返回一个迭代器。

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

如果您使用的是 python 2,如果您正在处理大型字典,您可能想要 useriteritems并且您想要做的就是迭代项目(不一定将它们复制到列表中)

于 2012-12-21T23:32:54.730 回答
7

正如@Wessie 所指出的,dict.iteritems,dict.iterkeysdict.itervalues(在 Python2.x 中返回迭代器)以及dict.viewitems,dict.viewkeysdict.viewvalues(在 Python2.x 中返回视图对象)都在 Python3.x 中被删除

dict.items, dict.keysanddict.values用于在 Python2.x 中返回字典列表的副本,现在在 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'>
于 2013-12-02T12:53:02.833 回答
7

你不能在 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'

viewitems也是如此,它在 Python 3 中可用。

此外,由于items返回字典对列表的副本(key, value),因此效率较低,除非您无论如何都想创建副本。

在 Python 2 中,最好使用iteritems迭代。如果您决定升级到 Python 3,该2to3工具可以替换它。items

于 2014-07-04T08:23:29.933 回答
4

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

于 2020-03-31T09:23:29.607 回答