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



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



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


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

618   8  

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

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

вы должны учитывать, что этот способ удаления объекта из 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 () довольно лаконично и легко читается:

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}

это работает. И 'e 'не вызывал ошибки, хотя у 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

Comments

    Ничего не найдено.