views:

190

answers:

2

I'm trying to construct a dictionary that contains a series of sets:

{Field1:{Value1, Value2, Value3}, Field2{Value4}}

The trouble is, I then wish to delete any fields from the dictionary that only have one value in the set. I have been writing code like this:

for field in FieldSet:
if len(FieldSet[field]) == 1:
    del(FieldSet[field])

But receive the error "RuntimeError: dictionary changed size during execution". (Not surprising, since that's what I'm doing.) It's not the be-all and end-all if I have to knock together some sort of workaround, but is it possible to do this?

+9  A: 

Iterate over the return value from .keys() instead. Since you get a list of keys back, it won't be affected by changing the dictionary after you've called it.

Amber
That is to say, replace the first line with this: `for field in FieldSet.keys():`
Smashery
I'm actually using python3, so the corrected line was: for field in list(FieldSet.keys()):
Margaret
Shouldn't be necessary to convert to a list in this case.
monkut
Maybe, but it seemed to continue to throw the same error with the code Smashery suggested.
Margaret
The list conversion is necessary in this case since the generator is lazily-evaluated, and thus on its own, it's susceptible to modifications mid-iteration. Converting to list pulls out all the keys before the iteration begins.
Amber
+8  A: 

A sometimes-preferable alternative to changing FieldSet in place is sometimes (depending on the amount of alterations performed) to build a new one and bind it to the existing name:

FieldSet = dict((k, v) for k, v in FieldSet.iteritems()
                if len(v) != 1)
Alex Martelli