dict.items()和dict.iteritems()之间有什么适用的区别吗?

来自Python文档:

dict.items():返回字典的(键,值)对列表的副本。 dict.iteritems():返回字典(key, value)对上的迭代器。

如果我运行下面的代码,每一个似乎都返回一个对相同对象的引用。有没有什么细微的差别是我没有注意到的?

#!/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 '\tthey are the same object' 
   else: print '\tthey are different'

print 'd.iteritems():'   
for k,v in d.iteritems():
   if d[k] is v: print '\tthey are the same object' 
   else: print '\tthey 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

当前回答

如果你有

{key1:value1, key2:value2, key3:value3,…}

在Python 2中,dict.items()复制每个元组并返回字典中的元组列表,即[(key1,value1), (key2,value2),…]。 含义是整个字典被复制到包含元组的新列表中

dict = {i: i * 2 for i in xrange(10000000)}  
# Slow and memory hungry.
for key, value in dict.items():
    print(key,":",value)

iteritems()返回字典项迭代器。返回项的值也是相同的,即(key1,value1), (key2,value2),…,但这不是一个清单。这只是一个字典项迭代器对象。这意味着更少的内存使用(减少50%)。

作为可变快照的列表:d.items() -> list(d.items()) 迭代器对象:d.t iteritems() -> iter(d.s ititems ())

元组是一样的。你比较了每个的元组,所以你得到相同的结果。

dict = {i: i * 2 for i in xrange(10000000)}  
# More memory efficient.
for key, value in dict.iteritems():
    print(key,":",value)

在Python 3中,dict.items()返回迭代器对象。Dict.iteritems()被移除,因此不再有问题。

其他回答

你问:“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()返回一个dictionary-itemiterator。

作为一个列表,d.s 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.t 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()之间的适用差异与列表和迭代器之间的适用差异相同。

在Py2.x

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

命令dict.iteritems()、dict.iterkeys()和dict.itervalues()返回一个遍历字典(k, v)对、键和值的迭代器。

命令dict.viewitems(), dict.viewkeys()和dict.viewvalues()返回视图对象,可以反映字典的变化。 (也就是说,如果你删除一个项或在字典中添加一个(k,v)对,视图对象可以同时自动更改。)

$ 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中的dict.viewitems()一样返回视图对象。x。

But

正如@lvc所指出的,viewobject和iterator不一样,所以如果你想在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'>

字典iteritems在Python3中消失。因此使用iter(dict.items())来获得相同的输出和内存分配

Dict.items()返回元组列表,dict.iteritems()返回字典中元组的迭代器对象为(key,value)。元组是相同的,但容器是不同的。

Dict.items()基本上将所有字典复制到列表中。尝试使用以下代码来比较dict.items()和dict.iteritems()的执行时间。你会发现其中的不同。

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer() #more memory intensive
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems(): #less memory intensive
    tmp = key + value
t2 = timeit.default_timer() - start

在我的机器输出:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

这清楚地表明dictionary.iteritems()要高效得多。

这是进化的一部分。

最初,Python items()构建了一个真正的元组列表并返回该列表。这可能会占用大量额外的内存。

然后,将生成器引入到语言中,并将该方法重新实现为名为iteritems()的迭代器生成器方法。保留原始版本用于向后兼容。

Python 3的一个变化是items()现在返回视图,列表永远不会完全构建。iteritems()方法也消失了,因为Python 3中的items()工作方式类似于Python 2.7中的viewitems()。