Вопрос-Ответ

How can I remove a key from a Python dictionary?

Как я могу удалить ключ из словаря Python?

Я хочу удалить ключ из словаря, если он присутствует. В настоящее время я использую этот код:

if key in my_dict:
del my_dict[key]

Без if инструкции код вызовет запросKeyError, если ключ отсутствует. Как я могу справиться с этим проще?


Смотрите Удаление элемента из словаря для более общих подходов к проблеме удаления ключа из dict (включая те, которые создают измененную копию).

Переведено автоматически
Ответ 1

Чтобы удалить ключ независимо от того, есть ли он в словаре, используйте форму с двумя аргументами dict.pop():

my_dict.pop('key', None)

Это вернет значение, my_dict[key] если key оно существует в словаре, и None в противном случае. Если второй параметр не указан (т.Е. my_dict.pop('key')) и key не существует, возникает KeyError.

Чтобы удалить ключ, который гарантированно существует, вы также можете использовать

del my_dict['key']

Это вызовет KeyError если ключа нет в словаре.

Ответ 2

В частности, чтобы ответить на вопрос "есть ли однострочный способ сделать это?"

if 'key' in my_dict: del my_dict['key']

...ну, ты спросил ;-)

Однако вам следует учитывать, что этот способ удаления объекта из a dict не является атомарным — возможно, что 'key' может находиться в my_dict во время if выполнения инструкции, но может быть удален до del выполнения, и в этом случае del произойдет сбой с KeyError. Учитывая это, было бы безопаснее либо использовать dict.pop, либо что-то вроде

try:
del my_dict['key']
except KeyError:
pass

который, конечно, определенно не является однострочным.

Ответ 3

Мне потребовалось некоторое время, чтобы понять, что именно my_dict.pop("key", None) делает. Поэтому я добавлю это в качестве ответа, чтобы сэкономить другим время поиска в Google:


pop(key[, default])


Если ключ есть в словаре, удалите его и верните его значение, иначе верните значение по умолчанию. Если не задано значение по умолчанию и ключа нет в словаре, возникает a KeyError.


Документация

Ответ 4

del my_dict[key] это немного быстрее, чем my_dict.pop(key) для удаления ключа из словаря, когда ключ существует

>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"

>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786

Но когда ключ не существует, if key in my_dict: del my_dict[key] это немного быстрее, чем my_dict.pop(key, None). Оба по крайней мере в три раза быстрее, чем del в операторе try/except:

>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """

>>> timeit.timeit(try_except, setup=setup)
0.133
python dictionary