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

при попытке удалить ключ из словаря, я пишу:

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

есть ли один способ сделать это?

8 ответов


использовать dict.pop():

my_dict.pop('key', None)

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


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

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

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

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

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

что, конечно, определенно не один вкладыш.


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

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

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

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


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

маленький словарик:

>>> 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

Если вам нужно удалить много ключей из словаря в одной строке кода, я думаю, что использование 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}

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

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

это работает. И это не вызвало ошибки, хотя у myDict не было ключа "e".


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

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

иначе:

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

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


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

del dict[key]

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

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