Как лучше всего удалить элемент из словаря по значению, т.е. когда ключ элемента неизвестен? Вот простой подход:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Есть способы лучше? Что-то не так с изменением (удалением элементов) из словаря при его повторении?
python
dictionary
Buttons840
источник
источник
Ответы:
Имейте в виду, что в настоящее время вы проверяете идентичность объекта (
is
возвращается только в томTrue
случае, если оба операнда представлены одним и тем же объектом в памяти - это не всегда происходит с двумя объектами, которые сравниваются с равными==
). Если вы делаете это специально, то можете переписать свой код какНо это может не делать того, что вы хотите:
Так что вы, вероятно, захотите
!=
вместоis not
.источник
some_dict.iteritems()
здесь и поставитьfor
иif
заявление на отдельных строки для удобства чтенияiteritems
сейчасitems
. В Python 2.7iteritems()
действительно лучше.dict()
использовать соответствующее выражение генератора, равное 2.4. meta: можете просмотреть здесь, чтобы узнать что- нибудь .dict.pop(key[, default])
Метод позволяет удалять элементы , когда вы знаете , ключ. Он возвращает значение ключа, если он удаляет элемент, иначе он возвращает то, что было передано какdefault
. См. Документацию » .Пример:
источник
источник
Простое сравнение между del и pop () :
результат:
Итак, del быстрее, чем pop () .
источник
pop()
(как это делает @ n-1-1 выше), который не является вариантом дляdel
оператора.timeit
. Спасибо за этот наглядный пример.items()
возвращает список, и это тот список, который вы повторяете, поэтому изменение dict в цикле здесь не имеет значения. Если бы вы использовалиiteritems()
вместо этого, изменение dict в цикле было бы проблематичным , как иviewitems()
в Python 2.7.Я не могу придумать лучшего способа удалить элементы из dict по значению.
источник
Я бы составил список ключей, которые нужно удалить, а затем удалил бы их. Это просто, эффективно и позволяет избежать проблем с одновременным повторением и изменением dict.
источник
c - новый словарь, a - ваш исходный словарь, {'z', 'w'} - ключи, которые вы хотите удалить из
Также проверьте: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
источник
источник
Нет ничего плохого в удалении элементов из словаря во время итерации, как вы предложили. Будьте осторожны с несколькими потоками, использующими один и тот же словарь одновременно, что может привести к ошибке KeyError или другим проблемам.
Конечно, смотрите документацию на http://docs.python.org/library/stdtypes.html#typesmapping
источник
for k,v in d.iteritems(): del d[k]
дастRuntimeError: dictionary changed size during iteration
. См. Объяснение Митранди.Вот как бы я это сделал.
источник