#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'}
Комментариев нет:
Отправить комментарий