What is the difference between dict.items() and dict.iteritems() in Python2?
It's 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.
In Py2.x
The commands dict.items()
, dict.keys()
and dict.values()
return a copy of the dictionary's 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 dictionary's 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 isn't 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'>