什么时候应使用iteritems()代替items()?


153

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

编辑:为澄清起见,我想知道以类似于生成器的方式(一次将一项,而不是全部都存储到内存中)以与Python 2和Python 3兼容的方式遍历字典的正确习惯是什么。 ?

Answers:


148

在Python 2.x中- .items()返回(键,值)对的列表。在Python 3.x中,.items()现在是一个itemview对象,它的行为有所不同-因此必须对其进行迭代或实例化...因此,list(dict.items())对于dict.items()Python 2.x中的对象来说,这是必需的。

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

简单的例子:

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

会为您提供常见键的列表,但是同样,在Python 3.x中-只需使用即可.keys()

通常使Python 3.x更加“懒惰”-即map现在有效itertools.imapzipis itertools.izip等等。


96

dict.iteritems之所以被删除是因为dict.items现在它dict.iteritems在python 2.x中做了,甚至通过将它变成了itemview



9

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

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

如果您使用的是python 2,则可能需要iteritems使用大型字典,而您要做的就是遍历所有项目(不必将它们复制到列表中)


我知道这iteritems是一个迭代器,这就是为什么它如此有用的原因。我几乎永远都不想遍历字典作为列表。那么用某种兼容Python 2和3的生成器迭代字典的正确方法是什么?

3
@ user248237 for key in some_dict可以同时使用-和2to3工具都将转换iteritems()items()...
Jon Clements

1
@JonClements:足够公平,尽管我一直认为这for k in d: d[k]是不必要的冗长/非pythonic

6

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

dict.itemsdict.keys并且dict.values曾经用于在Python2.x中返回字典列表的副本,现在返回了Python3.x中的视图对象但是它们仍然与iterator并不相同。

如果要在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'>

当要进行反向查找时,哪种方法更有效?查看对象还是迭代器?
lifebalance

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)]

如果使用,将中断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),因此效率较低,除非您仍然要创建副本。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.