Найти - Пользователи
Полная версия: Удаление частей словаря в цикле
Начало » Python для новичков » Удаление частей словаря в цикле
1 2 3
WhiteTiger
Всем привет. Возникла необходимость в цикле обойти словарь и удалить некоторые его элементы. Кандидаты на удаление обнаружаются с помощью условия внутри этого цикла. Вот банальный пример подобного кода:
myDict = {'a': 1, 'b': 2}
for k in myDict:
    if k == 'a':
        del myDict[k]
Третий питон, при запуске, ругается на то, что во время обхода словаря меняется его размер
RuntimeError: dictionary changed size during iteration
Можно ли как-то этого избежать? Со списками такой фокус проходит (удаляю элементы через .remove()). Хотелось бы и со словарями научиться это делать.
Romiss
myDict = {'a': 1, 'b': 2}
for k in myDict.keys():
    if k == 'a':
        del myDict[k]
print myDict
Yott
Romiss , ваш фрагмент кода вызывает такой же протест
Romiss
Yott
Romiss , ваш фрагмент кода вызывает такой же протест
Да, вы правы в python 2.7 работает,а вот 3 выдает ошибку.
elisk
Выше написанный код сработает во втором питоне. В третьем немного по-другому. Один из способов - через копию:
#-*- 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}
reclosedev
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)
elisk
reclosedev
for 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}
WhiteTiger
Всем спасибо! Решал через создание копии. Думал что использовал костыль, а оказывается нет
py.user.next
>>> myDict = {'a': 1, 'b': 2}
>>> for k in set(myDict):
...     if k == 'a':
...         del myDict[k]
... 
>>> myDict
{'b': 2}
>>>
JOHN_16
py.user.next
а в чем здесь выгода множеств в отличии от списка, кортежа?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB