Я хочу удалить ключ из словаря, если он присутствует. В настоящее время я использую этот код:
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.
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: