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

При удалении ключа из словаря я использую:

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

Есть ли однострочный способ сделать это?

Ответы

Ответ 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 myDict: del myDict['key']

... ну, вы спросили: -)

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

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

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

Ответ 3

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

pop (клавиша [, по умолчанию])

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

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

Ответ 4

Сроки из трех решений, описанных выше.

del - самый быстрый способ удаления ключа из словаря Python

Небольшой словарь:

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

Большой словарь:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532

Ответ 5

Если вам нужно удалить много ключей из словаря в одной строке кода, я думаю, что использование map() довольно лаконично и читабельно на Pythonic:

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

И если вам нужно отлавливать ошибки, когда вы выводите значение, которого нет в словаре, используйте lambda в map() следующим образом:

map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

или в python3 вы должны использовать вместо этого понимание списка:

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

Оно работает. И "e" не вызывало ошибку, даже если у myDict не было клавиши "e".

Ответ 6

Использование:

>>> if myDict.get(key): myDict.pop(key)

По-другому:

>>> {k:v for k, v in myDict.items() if k != 'key'}

Вы можете удалить по условиям. Нет ошибки, если key не существует.

Ответ 7

Используя ключевое слово "del":

del dict[key]

Ответ 8

Мы можем удалить ключ из словаря Python несколькими следующими способами.

Использование ключевого слова del; это почти такой же подход, как вы сделали, хотя -

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

Или же

Мы можем сделать как следующее:

Но следует помнить, что в этом процессе он фактически не удалит какой-либо ключ из словаря, а не исключит конкретный ключ из этого словаря. Кроме того, я заметил, что он возвратил словарь, который не был упорядочен так же, как myDict.

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

Если мы запустим его в оболочке, он выполнит что-то вроде {'five': 500, 'four': 400, 'three': 300, 'two': 200} - обратите внимание, что это не тот же myDict что и myDict. Опять же, если мы попытаемся напечатать myDict, то увидим все ключи, включая которые мы исключили из словаря этим подходом. Однако мы можем создать новый словарь, назначив следующую переменную в переменную:

var = {key:value for key, value in myDict.items() if key != 'one'}

Теперь, если мы попытаемся распечатать его, он будет следовать родительскому порядку:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

Или же

Используя метод pop().

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

Разница между del и pop заключается в том, что, используя метод pop(), мы можем сохранить значение ключа, если это необходимо, например, следующим образом:

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

Разместите эту суть для дальнейшего использования, если вы найдете это полезным.

Ответ 9

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

try: 
    del dict[key]

except KeyError: pass

Однако это медленнее, чем метод pop(), если ключ не существует.

my_dict.pop('key', None)

Для нескольких клавиш это не имеет значения, но если вы делаете это несколько раз, тогда лучше использовать последний метод.

Самый быстрый подход заключается в следующем:

if 'key' in dict: 
    del myDict['key']

Но этот метод опасен, потому что если 'key' будет удален между двумя строками, будет KeyError.

Ответ 10

Я предпочитаю неизменную версию

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}

Ответ 11

Другой способ заключается в использовании items() + dict compethsion

items() в сочетании с пониманием dict может также помочь нам решить задачу удаления пары ключ-значение, но у него есть недостаток, заключающийся в том, что он не является встроенной техникой dict. На самом деле новый диктат, если он создан, за исключением ключа, который мы не хотим включать.

test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21} 

# Printing dictionary before removal 
print ("dictionary before performing remove is : " + str(test_dict)) 

# Using items() + dict comprehension to remove a dict. pair 
# removes  vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'} 

# Printing dictionary after removal 
print ("dictionary after remove is : " + str(new_dict)) 

Вывод:

dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}