При удалении ключа из словаря я использую:
if 'key' in myDict:
del myDict['key']
Есть ли однострочный способ сделать это?
11 ответов
Чтобы удалить ключ независимо от того, есть ли он в словаре, используйте форму с двумя аргументами dict.pop()
:
my_dict.pop('key', None)
Это вернет my_dict[key]
, если key
существует в словаре, и None
в противном случае. Если второй параметр не указан (т. Е. my_dict.pop('key')
) и key
не существует, вызывается KeyError
.
Чтобы удалить ключ, который гарантированно существует, вы также можете использовать
del my_dict['key']
Это вызывает KeyError
, если ключ не существует в словаре.
Другой способ - использование 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}
Использование:
>>> if myDict.get(key): myDict.pop(key)
По-другому:
>>> {k:v for k, v in myDict.items() if k != 'key'}
Вы можете удалить по условиям. Нет ошибки, если key
не существует.
Если вам нужно удалить много ключей из словаря в одной строке кода, я думаю, что использование 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».
В частности, чтобы ответить "есть ли способ сделать это в одну строку?"
if 'key' in myDict: del myDict['key']
... хорошо, вы спросили ;-)
Однако вы должны учитывать, что этот способ удаления объекта из dict
не атомарный - это возможно, что 'key'
может быть в myDict
во время оператора if
, но может быть удалено до выполнения del
, и в этом случае del
завершится с ошибкой { { Х6 }} . Учитывая это, было бы безопаснее использовать dict.pop
или что-то вроде
try:
del myDict['key']
except KeyError:
pass
Что, безусловно, определенно не однострочное.
Вы можете использовать обработку исключений, если хотите быть очень многословным:
try:
del dict[key]
except KeyError: pass
Однако это медленнее, чем метод pop()
, если ключ не существует.
my_dict.pop('key', None)
Для нескольких клавиш это не имеет значения, но если вы делаете это неоднократно, тогда лучше использовать последний метод.
Самый быстрый подход заключается в следующем:
if 'key' in dict:
del myDict['key']
Но этот метод опасен, потому что если 'key'
будет удален между двумя строками, KeyError
будет поднят.
Используя ключевое слово "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
, тогда мы сможем увидеть все ключи, включая которые мы исключили из словаря этим подходом. Однако мы можем создать новый словарь, назначив следующую переменную в переменную:
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
Разложите этот список для дальнейшего использования, если вы найдете это полезным.
Я предпочитаю неизменную версию
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}
Мне потребовалось некоторое время, чтобы понять, что именно my_dict.pop("key", None)
делает. Поэтому я добавлю это в качестве ответа, чтобы сэкономить время для поиска в Google:
pop(key[, default])
Если ключ находится в словаре, удалите его и верните его значение, иначе вернуть по умолчанию . Если значение по умолчанию не задано, а ключ отсутствует в словарь,
KeyError
поднимается.
Сроки трех решений, описанных выше.
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
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.