dictionary size changed during iteration
roy at panix.com
Fri Apr 22 15:15:46 CEST 2011
In article <mailman.644.1303306435.9059.python-list at python.org>,
Peter Otten <__peter__ at web.de> wrote:
> You now have to create the list explicitly to avoid the error:
> >>> d = dict(a=1)
> >>> keys = list(d.keys())
> >>> for k in keys:
> ... d["b"] = 42
That works, but if d is large, it won't be very efficient because it has
to generate a large list.
If d is large, and the number of keys to be mutated is relatively small,
a better solution may be to do it in two passes. The first loop
traverses the iterator and builds a list of things to be changed. The
second loop changes them.
changes = [ ]
for key in d.iterkeys():
for key in changes:
d[key] = "I'm not dead yet"
Both solutions are O(n), but the second may run significantly faster and
use less memory.
More information about the Python-list