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

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

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

2399
Tony 1 Июл 2012 в 00:27

11 ответов

Лучший ответ

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

my_dict.pop('key', None)

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

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

del my_dict['key']

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

2652
Sven Marnach 14 Сен 2019 в 18:53

Другой способ - использование items () + dict

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}
1
Sai Kiran Sangam 17 Сен 2019 в 19:25

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

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

По-другому:

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

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

16
Peter Mortensen 29 Май 2018 в 13:54

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

43
Marc Maxmeister 7 Май 2019 в 20:13

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

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

... хорошо, вы спросили ;-)

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

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

Что, безусловно, определенно не однострочное.

341
Community 23 Май 2017 в 11:47

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

try: 
    del dict[key]

except KeyError: pass

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

my_dict.pop('key', None)

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

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

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

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

3
Alec Alameddine 25 Май 2019 в 04:06

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

del dict[key]
14
Peter Mortensen 29 Май 2018 в 13:55

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

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

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

8
iNet 11 Ноя 2018 в 23:02

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

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}
1
CervEd 14 Июн 2019 в 08:44

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

pop(key[, default])

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

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

143
Michael - Where's Clay Shirky 7 Ноя 2019 в 15:31

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

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
48
Mikhail_Sam 25 Апр 2019 в 13:03