dict.items()和dict.iteritems()有什么区别?

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 '\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 

这是一个演变的一部分。

最初,Python items()构build了一个真正的元组列表并返回。 这可能需要大量额外的内存。

然后,通常将生成器引入到该语言中,并将该方法重新实现为名为iteritems()的迭代器生成器方法。 原来的遗留向后兼容性。

Python 3的变化之一是items()现在返回迭代器,并且列表永远不会被完全构build。 iteritems()方法也不见了,因为Python 3中的items()就像Python 2.7中的viewitems()一样工作。

dict.items()返回一个2元组列表( [(key, value), (key, value), ...] ),而dict.iteritems()是一个产生2元组的生成器。 前者需要更多的空间和时间,但每个元素的访问速度都很快,而第二个元素最初需要的空间和时间更less,而生成每个元素需要更多的时间。

在Py2.x中

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

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

命令dict.viewitems()dict.viewkeys()dict.viewvalues()返回可以反映字典变化的视图对象 。 (也就是说,如果在字典中del一个项目或添加(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()可用,它们返回视图对象 ,就像dict.viewitems()

就像@lvc指出的那样, view对象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'> 

你问:“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.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()之间的适用差异与列表和迭代器之间的适用差异相同。

dict.items()返回元组列表, dict.iteritems()返回字典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()更有效率。

如果你有

dict = {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) 

dict.iteritems()返回字典项迭代器。 返回的项目的值也是相同的,即(key1,value1), (key2,value2), ...但这不是一个列表。 这只是字典项目迭代器对象。 这意味着更less的内存使用量(减less50%)。

  • 列出为可变快照: d.items() -> list(d.items())
  • 迭代器对象: d.iteritems() -> iter(d.items())

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

 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()被删除,所以没有更多的问题。