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]}