How to avoid "RuntimeError: dictionary changed size during iteration" error? How to avoid "RuntimeError: dictionary changed size during iteration" error? python python

How to avoid "RuntimeError: dictionary changed size during iteration" error?


In Python 3.x and 2.x you can use use list to force a copy of the keys to be made:

for i in list(d):

In Python 2.x calling keys made a copy of the keys that you could iterate over while modifying the dict:

for i in d.keys():

But note that in Python 3.x this second method doesn't help with your error because keys returns an a view object instead of copynig the keys into a list.


You only need to use "copy":

On that's way you iterate over the original dictionary fields and on the fly can change the desired dict (d dict).It's work on each python version, so it's more clear.

In [1]: d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}In [2]: for i in d.copy():   ...:     if not d[i]:   ...:         d.pop(i)   ...:         In [3]: dOut[3]: {'a': [1], 'b': [1, 2]}


Just use dictionary comprehension to copy the relevant items into a new dict

>>> d{'a': [1], 'c': [], 'b': [1, 2], 'd': []}>>> d = { k : v for k,v in d.iteritems() if v}>>> d{'a': [1], 'b': [1, 2]}

For this in Python 3

>>> d{'a': [1], 'c': [], 'b': [1, 2], 'd': []}>>> d = { k : v for k,v in d.items() if v}>>> d{'a': [1], 'b': [1, 2]}