Ответ 1
Итерации над возвращаемым значением из .keys()
. Поскольку вы получаете список ключей назад, это не повлияет на изменение словаря после его вызова.
Я пытаюсь построить словарь, содержащий серию множеств:
{Field1:{Value1, Value2, Value3}, Field2{Value4}}
Проблема в том, что я хочу удалить любые слова из словаря, в котором есть только одно значение в наборе. Я пишу код следующим образом:
for field in FieldSet:
if len(FieldSet[field]) == 1:
del(FieldSet[field])
Но получите ошибку "RuntimeError: измененный размер словаря во время выполнения". (Не удивительно, с тех пор, что я делаю.) Это не все и все, если мне придется сбить какое-то обходное решение, но можно ли это сделать?
Итерации над возвращаемым значением из .keys()
. Поскольку вы получаете список ключей назад, это не повлияет на изменение словаря после его вызова.
Иногда предпочтительная альтернатива замене FieldSet
на месте иногда (в зависимости от количества выполненных изменений), чтобы создать новую и привязать ее к существующему имени:
FieldSet = dict((k, v) for k, v in FieldSet.iteritems()
if len(v) != 1)
Существует метод pop. Он удаляет элемент, который вызывает ключ. Что касается вашего примера, это выглядит так:
for field in FieldSet.keys():
if len(FieldSet[field]) == 1:
FieldSet.pop(field)
Это в python 3.2, но я не уверен, что это новая функция: http://docs.python.org/dev/library/stdtypes.html#dict.pop
Просто попробовал, и он работает как рекламируемый.