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>

Leave a Reply

Your email address will not be published.