如何从Python字典中删除键?

有没有一种从字典中删除键而不会引发KeyError的单行方法?

if 'key' in my_dict:del my_dict['key']
2496838 次浏览

要删除键,无论它是否在字典中,请使用#0的双参数形式:

my_dict.pop('key', None)

如果字典中存在key,则返回my_dict[key],否则返回None。如果未指定第二个参数(即my_dict.pop('key'))并且key不存在,则引发KeyError

要删除保证存在的密钥,您还可以使用:

del my_dict['key']

如果键不在字典中,这将引发KeyError

具体地回答“有没有一种单行的方法来做到这一点?”

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

好吧,你要求;-)

但是,您应该考虑,从dict中删除对象的这种方式是不是原子-'key'可能在if语句期间位于my_dict中,但可能在del执行之前被删除,在这种情况下del将以KeyError失败。鉴于此,最安全的方法是使用#7或类似于

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

当然,这绝对是没有的一行。

我花了一些时间才弄清楚my_dict.pop("key", None)到底在做什么。所以我将添加这个作为答案,以节省其他人的谷歌时间:

pop(key[, default])

如果关键在字典中,删除它并返回它的值,否则返回默认。如果没有给出默认并且关键不在字典,一个KeyError被提出。

文档

如果你需要在一行代码中从字典中删除很多键,我认为使用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()中使用lambda,如下所示:

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'键。

您可以使用字典理解创建一个删除该键的新字典:

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

您可以按条件删除。如果key不存在,则没有错误。

当键存在时,从字典中删除键时,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

但是当键不存在时,if key in my_dict: del my_dict[key]my_dict.pop(key, None)略快。在try/except语句中,两者都比del快至少三倍:

>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)0.0229>>> timeit.timeit("d.pop('missing key', None)", setup=setup)0.0426>>> try_except = """... try:...     del d['missing key']... except KeyError:...     pass... """>>> timeit.timeit(try_except, setup=setup)0.133

我们可以通过以下一些方法从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'}

如果我们在shell中运行它,它将执行类似于{'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}

delpop之间的区别在于,使用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

Fork这一要点供将来参考,如果您发现这很有用。

如果您想非常详细,您可以使用异常处理:

try:del dict[key]
except KeyError: pass

但是,如果键不存在,这比pop()方法慢。

my_dict.pop('key', None)

这对几个键来说并不重要,但如果你反复这样做,那么后一种方法是更好的选择。

最快的方法是这样的:

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

但这种方法是危险的,因为如果在两行之间删除'key',将引发KeyError

我更喜欢不可变的版本

foo = {1:1,2:2,3:3}removeKeys = [1,2]def woKeys(dct, keyIter):return {k:vfor k,v in dct.items() if k not in keyIter}
>>> print(woKeys(foo, removeKeys)){3: 3}>>> print(foo){1: 1, 2: 2, 3: 3}

另一种方法是使用项目()+字典理解。

项目()加上字典理解也可以帮助我们实现键值对删除的任务,但它的缺点是不是一个到位的字典技术。实际上,如果创建了一个新的字典,除了我们不想包含的键。

test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removalprint ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair# removes  vinodnew_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removalprint ("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}

如果您想在没有KeyError的情况下执行此操作,您可以声明一个临时类并将其设置为dict.get中的默认值,如果该值等于该类,则意味着该键不存在

钥匙和快译通

a={"Assemblyisscary":3637}key1="Assemblyisscary"key2="Binarylangisnightmare"

删除函数

def delkey(dictionary,key):class temp:passif temp==dictionary.get(key,temp):return Falseelse: del dictionary[key];return True

测试

delete(a,key2)delete(a,key1)

产出

FalseTrue