python – What is the difference between dict.items() and dict.iteritems() in Python2?
python – What is the difference between dict.items() and dict.iteritems() in Python2?
Its part of an evolution.
Originally, Python items()
built a real list of tuples and returned that. That could potentially take a lot of extra memory.
Then, generators were introduced to the language in general, and that method was reimplemented as an iterator-generator method named iteritems()
. The original remains for backwards compatibility.
One of Python 3’s changes is that items()
now return views, and a list
is never fully built. The iteritems()
method is also gone, since items()
in Python 3 works like viewitems()
in Python 2.7.
dict.items()
returns a list of 2-tuples ([(key, value), (key, value), ...]
), whereas dict.iteritems()
is a generator that yields 2-tuples. The former takes more space and time initially, but accessing each element is fast, whereas the second takes less space and time initially, but a bit more time in generating each element.
python – What is the difference between dict.items() and dict.iteritems() in Python2?
In Py2.x
The commands dict.items()
, dict.keys()
and dict.values()
return a copy of the dictionarys list of (k, v)
pair, keys and values.
This could take a lot of memory if the copied list is very large.
The commands dict.iteritems()
, dict.iterkeys()
and dict.itervalues()
return an iterator over the dictionary’s (k, v)
pair, keys and values.
The commands dict.viewitems()
, dict.viewkeys()
and dict.viewvalues()
return the view objects, which can reflect the dictionarys changes.
(I.e. if you del
an item or add a (k,v)
pair in the dictionary, the view object can automatically change at the same time.)
$ 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>
While in Py3.x
In Py3.x, things are more clean, since there are only dict.items()
, dict.keys()
and dict.values()
available, which return the view objects just as dict.viewitems()
in Py2.x did.
But
Just as @lvc noted, view object isnt the same as iterator, so if you want to return an iterator in Py3.x, you could use 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>