Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Как удалить значение из словаря во время цикла for

#python #циклы


Как-то неожиданно столкнулся с такой проблемой. Во время цикла for по словарю мне
нужно удалять из него записи, но как не крути вылазит ошибка :
RuntimeError: dictionary changed size during iteration

Я даже пробовал делать снапшот словаря перед итерацией и итерировать двойника при
этом удаляя из оригинала.
Пример:
>>> ot={12:'wqe',13:'wqe',14:'wqe',15:'wqe'}
>>> ot1=ot
>>> for i in ot1:
...  del ot[i]
... 
Traceback (most recent call last):
  File "", line 1, in 
RuntimeError: dictionary changed size during iteration

Как удалять правильно?
upd:
разобрался, 
снапшот был уместен, но сделан чуть чуть неправильно
вот так правильно:
>>> ot={12:'wqe',13:'wqe',14:'wqe',15:'wqe'}
>>> ot1=ot.copy()
>>> for i in ot1:
...  del ot[i]
    


Ответы

Ответ 1



Вы неверно понимаете причину происходящего. Вы задаете вопрос Как удалять правильно, но верный вопрос Как копировать правильно? Вы передаете ссылку на объект из ot в ot1, то есть при этом ot и ot1 дают указатель на один и тот же словарь. ПРИМЕР x=['wtf', 'justdoit'] x1=x x1[0]='omg' print x >> ['omg', 'justdoit']

Ответ 2



Возможно правильнее было бы написать так: >>> ot={12:'wqe',13:'wqe',14:'wqe',15:'wqe'} >>> for i in ot**.keys()**: ... del ot[i]

Ответ 3



Чтобы можно было удалять элементы из словаря во время итерации, необходимо скопировать ключи: d = {12:'wqe',13:'wqe',14:'wqe',15:'wqe'} # ... for key in list(d): if condition(key): del d[key]

Ответ 4



У вас код намекает на то, что элемент будет удаляться по ключу, а не его значению. d = {12:'wqe',13:'wqe',14:'wqe',15:'wqe'} for key in list(d): if key == max(d.items(), key=operator.itemgetter(1)): del d[key] И не получается вашим методом почему-то. output: {12: 'wqe', 13: 'wqe', 14: 'wqe', 15: 'wqe'}

Комментариев нет:

Отправить комментарий