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