удаление пары ключ-значение из словаря - PullRequest
0 голосов
/ 21 октября 2018

Если я определил aDict следующим образом

{'1': 6, '2': 15, '3': 16, '4': 71, '5': 33}

и у меня есть aValue

16

Как удалить все пары ключ / значение, содержащие значение < aValue?

Я безуспешно пытался pop.Я мог бы, вероятно, сойти с рук, просто изменив значение на 0, но даже это даст мне RuntimeError: dictionary changed size during iteration

Что бы я действительно хотел, так это выводить

{'3': 16, '4': 71, '5': 33}

Нарезка и понимание словаря сейчас немного выше моей головы, мой текущий нерабочий код:

for k, v in aDict.iteritems():
    if v < aValue:
        del aDict[k]

1 Ответ

0 голосов
/ 21 октября 2018

Лично я думаю, что лучше создать новый словарь, так как это более «декларативный» и менее подверженный ошибкам: могут быть объекты, которые ссылаются на словарь, и теперь вдруг, чтословарь изменится.

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

aDict = { k: v for k, v in aDict.iteritems() if v >= aValue }

, что дает:

>>> { k: v for k, v in aDict.iteritems() if v >= aValue }
{'3': 16, '5': 33, '4': 71}

, таким образом, мы присваиваем new словарь к той же переменной, но другие атрибуты, переменные и т. д., которые могут ссылаться на старый словарь, не "видят" никаких изменений.

Если вы действительно хотите удалить элементы в словаре, лучше не итерация и изменение словаря одновременно, вы можете сначала создать список ключей, которые должны быть удалены, например:

ks = [k for k in aDict.iteritems() if v < aValue]
for k in ks:
    del aDict[k]

или в мы можем использовать .items(), так как это list:

# do *not* use this in Python-3.x
for k in aDict.items():
    if v < aValue:
        del aDict[k]
...