How to delete items from a dictionary while iterating over it? How to delete items from a dictionary while iterating over it? python python

How to delete items from a dictionary while iterating over it?


EDIT:

For Python3 (or greater):

>>> mydict{'four': 4, 'three': 3, 'one': 1}>>> for k in list(mydict.keys()):...     if mydict[k] == 3:...         del mydict[k]...>>> mydict{'four': 4, 'one': 1}

The rest of the answers works fine with Python2 but do not work for Python3 and raises RuntimeError.

RuntimeError: dictionary changed size during iteration.

This happens because mydict.keys() returns an iterator not a list.As pointed out in comments simply convert mydict.keys() to a list by list(mydict.keys()) and it should work.


For python2:

A simple test in the console shows you cannot modify a dictionary while iterating over it:

>>> mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}>>> for k, v in mydict.iteritems():...    if k == 'two':...        del mydict[k]...------------------------------------------------------------Traceback (most recent call last):  File "<ipython console>", line 1, in <module>RuntimeError: dictionary changed size during iteration

As stated in delnan's answer, deleting entries causes problems when the iterator tries to move onto the next entry. Instead, use the keys() method to get a list of the keys and work with that:

>>> for k in mydict.keys():...    if k == 'two':...        del mydict[k]...>>> mydict{'four': 4, 'three': 3, 'one': 1}

If you need to delete based on the items value, use the items() method instead:

>>> for k, v in mydict.items():...     if v == 3:...         del mydict[k]...>>> mydict{'four': 4, 'one': 1}


You could also do it in two steps:

remove = [k for k in mydict if k == val]for k in remove: del mydict[k]

My favorite approach is usually to just make a new dict:

# Python 2.7 and 3.xmydict = { k:v for k,v in mydict.items() if k!=val }# before Python 2.7mydict = dict((k,v) for k,v in mydict.iteritems() if k!=val)


Iterate over a copy instead, such as the one returned by items():

for k, v in list(mydict.items()):