Форум сайта python.su
Всем привет. Возникла необходимость в цикле обойти словарь и удалить некоторые его элементы. Кандидаты на удаление обнаружаются с помощью условия внутри этого цикла. Вот банальный пример подобного кода:
myDict = {'a': 1, 'b': 2} for k in myDict: if k == 'a': del myDict[k]
RuntimeError: dictionary changed size during iterationМожно ли как-то этого избежать? Со списками такой фокус проходит (удаляю элементы через .remove()). Хотелось бы и со словарями научиться это делать.
Офлайн
myDict = {'a': 1, 'b': 2} for k in myDict.keys(): if k == 'a': del myDict[k] print myDict
Офлайн
Romiss , ваш фрагмент кода вызывает такой же протест
Офлайн
YottДа, вы правы в python 2.7 работает,а вот 3 выдает ошибку.
Romiss , ваш фрагмент кода вызывает такой же протест
Офлайн
Выше написанный код сработает во втором питоне. В третьем немного по-другому. Один из способов - через копию:
#-*- coding: utf-8 -*- myDict = {'a': 1, 'b': 2} Dict = myDict.copy() for k in Dict.keys(): if k == 'a': del myDict[k] print("myDict: ", myDict) # myDict: {'b': 2} print("Dict: ", Dict) # Dict: {'a': 1, 'b': 2}
Офлайн
for k in list(myDict.keys()): ...
if key == 'a': ...
keys_to_delete = ['a', 'b', 'c'] for key in keys_to_delete: dct.pop(key, None)
Офлайн
reclosedevfor k in list(myDict.keys()): ...
myDict = {'a': 1, 'b': 2} for k in list(myDict.keys()): if k == 'a': myDict.pop(k) print("myDict: ", myDict) # myDict: {'b': 2}
Отредактировано elisk (Май 4, 2013 22:45:52)
Офлайн
Всем спасибо! Решал через создание копии. Думал что использовал костыль, а оказывается нет
Офлайн
>>> myDict = {'a': 1, 'b': 2} >>> for k in set(myDict): ... if k == 'a': ... del myDict[k] ... >>> myDict {'b': 2} >>>
Офлайн
py.user.next
а в чем здесь выгода множеств в отличии от списка, кортежа?
Офлайн