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

143 python python-3.x

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

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

Jon*_*nts 136

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

Python 2.7版也有一个有点背口密钥处理的,在你有viewkeys,viewitems而且viewvalues方法,最有用的存在viewkeys,其表现更像是一个set(你想从预期dict).

简单的例子:

common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
Run Code Online (Sandbox Code Playgroud)

将为您提供公共密钥的列表,但同样,在Python 3.x中 - 只需使用.keys().

Python 3.x通常被认为更"懒惰" - 即map现在是有效的itertools.imap,zipitertools.izip等等.

  • 它没有清楚地回答这个问题,我们应该使用什么来代替 .iteritems() ? (5认同)

Wes*_*sie 89

dict.iteritems被删除,因为dict.items现在dict.iteritems在python 2.x中做的事情,甚至通过使它成为一个改进了一点itemview.


Dea*_*evy 59

这六个库有助于编写与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)
Run Code Online (Sandbox Code Playgroud)


gon*_*opp 8

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

在python 3中,items返回一个视图,它与迭代器几乎相同.

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

  • @ user248237`for some_dict`中的key对两者都起作用 - 而且`2to3`工具将`iteritems()`转换为`items()`无论如何...... (3认同)
  • @JonClements:很公平,虽然我一直认为“for k in d: d[k]”是不必要的冗长/非pythonic (2认同)

YaO*_*OzI 6

正如@Wessie指出的,dict.iteritems,dict.iterkeysdict.itervalues(它返回一个迭代中Python2.x)以及dict.viewitems,dict.viewkeysdict.viewvalues(返回查看对象中Python2.x)均在Python3.x除去

而且dict.items,dict.keysdict.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'>
Run Code Online (Sandbox Code Playgroud)


Flo*_*ter 6

不能使用items,而不是iteritems在所有的Python的地方.例如,以下代码:

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)]
Run Code Online (Sandbox Code Playgroud)

如果你使用会破坏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'
Run Code Online (Sandbox Code Playgroud)

对于viewitems也是如此,它在Python 3中可用.

此外,由于items返回字典对列表的副本(key, value),因此效率较低,除非您想要创建副本.

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


Dan*_*iel 6

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)
Run Code Online (Sandbox Code Playgroud)

请参阅此链接:https ://python-future.org/completed_idioms.html