Удалить определенные ключи из словаря в Python - PullRequest
12 голосов
/ 10 мая 2010

Я пытаюсь создать словарь, который содержит серию наборов:

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

Проблема в том, что я хочу удалить из словаря все поля, которые имеют только одно значение в наборе. Я пишу такой код:

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

Но появляется сообщение об ошибке «RuntimeError: словарь изменил размер во время выполнения». (Не удивительно, так как это то, что я делаю.) Это не главное и конец, если мне нужно собрать какое-то решение, но возможно ли это сделать?

Ответы [ 3 ]

22 голосов
/ 10 мая 2010

Вместо этого переберите возвращаемое значение из .keys(). Поскольку вы получаете список ключей обратно, изменение словаря после того, как вы его вызвали, не повлияет на него.

14 голосов
/ 10 мая 2010

Иногда предпочтительной альтернативой изменению FieldSet является иногда (в зависимости от количества выполненных изменений) создание нового и привязка его к существующему имени:

FieldSet = dict((k, v) for k, v in FieldSet.iteritems()
                if len(v) != 1)
1 голос
/ 11 января 2012

Есть метод 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

Только что попробовал и работает как рекламируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...