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

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

  if 'key' в my_dict: del my_dict ['key']  

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


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

  my_dict.pop ('key', None)  

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

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

  del my_dict ['key'  ]  

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


В частности, чтобы ответить «есть ли однострочный способ сделать это?»

 , если 'key' в  my_dict: del my_dict ['key']  

… ну, вы спросили 😉

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

  try: del my_dict ['key'  ] кроме KeyError: передать  

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

9


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

pop (key [, default])

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

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

3


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  

Но если ключ не существует , если ключ в my_dict: del my_dict [key] немного быстрее, чем my_dict.pop (key, None) . Оба они как минимум в три раза быстрее, чем del в инструкции try / except :

 >>> timeit.timeit ("если 'отсутствует ключ' в d: del d ['отсутствует ключ']", setup = setup) 0,0229 >>> timeit.timeit ("d.pop (  'missing key', None) ", setup = setup) 0.0426 >>> try_except =" "" ... try: ... del d ['missing key'] ... за исключением KeyError: ... pass ..  . "" ">>> timeit.timeit (try_except, setup = setup) 0,133  

3


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

  myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4} map (myDict.pop, ['a  ',' c ']) # Список ключей для удаления >>> myDict {' b ': 2,' d ': 4}  

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

  map (lambda x: myDict.pop (x, None), ['a', 'c', 'e']) [1, 3, None] # pop возвращает >>> myDict {'b':  2, 'd': 4}  

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

  [myDict.pop (x, None) для x в ['a', 'c', 'e']]  

Это работает. И ‘e’ не вызвал ошибки, даже если myDict не имел ключа ‘e’.

7


Вы можете использовать понимание словаря для создания нового словаря с удаленным ключом:

 >  >> my_dict = {k: v вместо k, v в my_dict.items (), если k! = 'key'}  

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

2


Использование ключевого слова «del»:

  del dict [ключ]  

0


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

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

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

Или

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

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

  myDict = {'one': 100  , 'два': 200, 'три': 300, 'четыре': 400, 'пять': 500} {ключ: значение для ключа, значение в myDict.items (), если ключ! = 'один'}  

Если мы запустим его в оболочке, он выполнит что-то вроде {'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  

Вилка этого g ist на будущее, если вы сочтете это полезным.

2


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

  try: del dict [key] except KeyError: pass   

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

  my_dict.pop ('key', None)  

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

Самый быстрый подход следующий:

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

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


Тип данных Dictionary имеет метод, называемый dict_name.pop (item) , и его можно использовать для удаления key: value пара из словаря.

  a = {9: 4,2: 3,4: 2,1: 3} a.pop (9) print (a)  

Это даст результат как:

  {2: 3, 4: 2, 1: 3}   

Таким образом вы можете удалить элемент из словаря в одну строку.


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

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

  test_dict = {"sai": 22, "kiran": 21, "vinod"  : 21, "sangam": 21} # Печать словаря перед удалениемprint ("словарь перед выполнением удаления:" + str (test_dict)) # Использование items () + dict computing для удаления dict.  pair # удаляет vinodnew_dict = {key: val для ключа, val в test_dict.items () if key! = 'vinod'} # Печать словаря после удаленияprint ("словарь после удаления:" + str (new_dict))   

Вывод:

  словарь перед выполнением удаления: {'sai': 22, 'kiran': 21, 'vinod': 21,  'sangam': 21} словарь после удаления: {'sai': 22, 'kiran': 21, 'sangam': 21}  


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

  foo  = {1: 1, 2: 2, 3: 3} removeKeys = [1,2] def woKeys (dct, keyIter): вернуть {k: v для k, v в dct. items (), если k не в keyIter} >>> print (woKeys (foo, removeKeys)) {3: 3} >>> print (foo) {1: 1, 2: 2, 3: 3}   


Единый фильтр по ключу

  • вернуть «ключ» и удалить его из my_dict, если «ключ» существует в my_dict
  • вернуть «Нет», если «ключ» не существует в my_dict

это изменит my_dict на месте (изменяемый)

  my_dict.pop (  'key', None)  

Несколько фильтров по ключам

генерируют новый dict (неизменяемый)

  dic1 = {"x": 1, "y": 2, "z": 3} def func1 (item): return item [0]! = "x" и  item [0]! = "y" print (dict (filter (lambda item: item [0]! = "x" and item [0]! = "y", dic1.items ())))   

Оцените статью
motary.ru
Добавить комментарий