有适用dict.items()dict.iteritems()之间的差异?

从 Python 文档中︰

dict.items()︰ 返回的字典列表 (关键字,值) 的副本对。

dict.iteritems()︰ 在该词典的 (关键字,值) 返回迭代器对。

如果运行下面的代码时,每一个似乎返回同一对象的引用。是否有任何细微的差别,我忘记?

#!/usr/bin/python

d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
   if d[k] is v: print '	they are the same object' 
   else: print '	they are different'

print 'd.iteritems():'   
for k,v in d.iteritems():
   if d[k] is v: print '	they are the same object' 
   else: print '	they are different'   

输出︰

d.items():
    they are the same object
    they are the same object
    they are the same object
d.iteritems():
    they are the same object
    they are the same object
    they are the same object
2012-05-05 02:58:27
问题评论:

它基本上是计算方式的不同。items()同时创建项,并返回一个列表。iteritems()返回一台发电机,一台发电机是一项"创建"每次next()调用它一次对象。

在特定的情况下d[k] is v将始终返回 True 因为 python 中保存整数对象-5 和 256 之间的所有整数的数组︰ docs.python.org/2/c-api/int.html时,您实际上就是得到现有的参考范围对象创建一个 int: >> a = 2; b = 2 >> a is b True,但>> a = 1234567890; b = 1234567890 >> a is b False

回答:

它的发展过程的一部分。

最初,Python items()构建实际的元组的列表,并返回的。这可能要花大量的额外的内存。

然后,生成器引入的语言一般情况下,该方法非得与名为iteritems()的迭代器生成器方法。原来保持的向后兼容性。

Python 3 变化之一是, items()现在返回迭代器,并且永远不会完全生成列表。iteritems()方法也是消失,因为items() viewitems()在 Python 2.7 Python 3 运作中。

丢失了一个发展过程中的步骤说明︰ Py3 行为不iteritems()一样。实际上,它使一个完整的序列协议对象,也反映了对 dict (而且坚强后盾 dict 本身,而不是冗余的列表)-已到 2.7 为viewitems() backported.

想了解这更详细,但我失败我 google 的幸福。可能有人指向我文档、 文章或源,将帮助我更好地理解这吗?@lvc?

@Stew 更改所述PEP 3106并且没有更多在python 3.0 中的新增功能

dict.items()返回 2 元组的列表 ([(key, value), (key, value), ...]),而dict.iteritems()则会产生 2 元的生成器。前者采用更多的空间和时间开始时,但是访问的每个元素是快的而第二个采用较少的空间和时间,最初,但生成的每个元素中的更多一点时间。

为何每个元素相同的那?

为什么会希望他们是不同的?

在文档中的"复制"并不意味着这些元素被复制 (如果需要,使用copy.deepcopy)。这意味着它是字典项的副本︰ 如果做items = dct.items() ,然后通过添加/删除键修改dctdct[k] = other_vitems将保持不变。

我未将复制解释为意味着深层副本,并将不同元素...

Python 中的任何内容是不断的深层副本,除非明确说明这种情况。

在 Py2.x

命令dict.items()dict.keys()dict.values()返回的字典列表 (k, v)对,键和值的副本如果复制的列表很大,这可能需要大量内存。

命令dict.iteritems()dict.iterkeys()dict.itervalues()对的词典(k, v)对,键和值返回迭代器

命令dict.viewitems()dict.viewkeys()dict.viewvalues()返回查看的对象,它可以反映字典的更改。(即如果您del某一项或在词典中,添加(k,v)对 view 对象可以自动更改一次。)

$ python2.7

>>> d = {'one':1, 'two':2}
>>> type(d.items())
<type 'list'>
>>> type(d.keys())
<type 'list'>
>>> 
>>> 
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>
>>> type(d.iterkeys())
<type 'dictionary-keyiterator'>
>>> 
>>> 
>>> type(d.viewitems())
<type 'dict_items'>
>>> type(d.viewkeys())
<type 'dict_keys'>

在 Py3.x

在 Py3.x,事情要更干净,因为有只dict.items()dict.keys()dict.values() ,这就像在 Py2.x dict.viewitems()未返回视图对象

正如 @lvc 指出,视图对象不一样的迭代器,因此,如果您想要在 Py3.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'>

您问: 是否有适用 dict.items() 和 dict.iteritems() 之间的差异

这可能会有所帮助 (Python 的 2.x):

>>> d={1:'one',2:'two',3:'three'}
>>> type(d.items())
<type 'list'>
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>

您可以看到, d.items()返回的元组键,值对列表, d.iteritems()返回字典-itemiterator。

为列表时,d.items() 是切片可以︰

>>> l1=d.items()[0]
>>> l1
(1, 'one')   # an unordered value!

但不是会是__iter__方法︰

>>> next(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

D.iteritems() 是一个迭代器,能片︰

>>> i1=d.iteritems()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dictionary-itemiterator' object is not subscriptable

但确实有__iter__:

>>> next(d.iteritems())
(1, 'one')               # an unordered value!

因此项本身是相同--提供物料的容器都不同。其中一个是一个列表,另一个迭代器 (具体取决于使用 Python 版本...)

因此 dict.items() 和 dict.iteritems() 之间的适用差异是一个列表和一个迭代器的相应差异相同。

请输入您的翻译

What is the difference between dict.items() and dict.iteritems()?

确认取消