754

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
4

10 回答 10

919

这是进化的一部分。

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

然后,生成器被引入到语言中,并且该方法被重新实现为名为 的迭代器-生成器方法iteritems()。原始保留是为了向后兼容。

Python 3 的变化之一是 items()现在返回视图,并且 alist从未完全构建。该iteritems()方法也消失了,因为items()在 Python 3 中的工作方式与viewitems()在 Python 2.7 中一样。

于 2012-05-05T03:26:27.157 回答
103

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

于 2012-05-05T03:00:52.600 回答
73

在 Py2.x 中

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

commandsdict.iteritems()和返回字典对、键和值dict.iterkeys()迭代器。dict.itervalues()(k, v)

commands 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()available ,它们返回视图对象,就像dict.viewitems()在 Py2.x 中一样。

正如@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'>
于 2013-12-02T13:33:29.677 回答
35

你问:'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()返回一个字典迭代器。

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

于 2012-05-05T06:29:57.203 回答
15

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()效率更高。

于 2016-09-11T02:26:01.923 回答
11

dict.iteritems在 Python3.x 中没有了所以使用iter(dict.items())来获得相同的输出和内存分配

于 2018-10-16T13:40:33.890 回答
4

如果你有

dict = {key1:value1, key2:value2, key3:value3,...}

Python 2中,dict.items()复制每个元组并返回字典 ie 中的元组列表[(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()返回字典项迭代器。返回的项目的值也是相同的 ie (key1,value1), (key2,value2), ...,但这不是一个列表。这只是字典项迭代器对象。这意味着更少的内存使用(减少 50%)。

  • 列为可变快照: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() 已删除,因此不再有问题。

于 2016-09-11T01:37:43.510 回答
1

如果您想要一种方法来迭代适用于 Python 2 和 3 的字典的项目对,请尝试以下操作:

DICT_ITER_ITEMS = (lambda d: d.iteritems()) if hasattr(dict, 'iteritems') else (lambda d: iter(d.items()))

像这样使用它:

for key, value in DICT_ITER_ITEMS(myDict):
    # Do something with 'key' and/or 'value'.
于 2018-10-07T22:54:59.633 回答
0

dict.iteritems(): 给你一个迭代器。您可以在循环之外的其他模式中使用迭代器。

student = {"name": "Daniel", "student_id": 2222}

for key,value in student.items():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

for key,value in student.iteritems():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

studentIterator = student.iteritems()

print(studentIterator.next())
('student_id', 2222)

print(studentIterator.next())
('name', 'Daniel')
于 2018-08-29T12:50:31.807 回答
-7

python 2 中的 dict.iteritems() 等价于 python 3 中的 dict.items()。

于 2018-01-17T14:32:17.007 回答