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