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

if 'key' in my_dict:
    del my_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}

Or

我们可以这样做:

但我们应该记住,在这个过程中,实际上它不会从字典中删除任何键,而不是将特定的键从字典中排除。此外,我观察到它返回了一个与myDict排序不同的字典。

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

如果我们在shell中运行它,它将执行类似于{‘五’:500,‘四’:400,‘三’:300,‘二’: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}

Or

使用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

如果你觉得这很有用的话,就把这个要点岔开,以备将来参考。

其他回答

如果您需要在一行代码中从字典中删除大量键,我认为使用map()非常简洁,而且Python可读:

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

它起作用了。即使myDict没有'e'键,'e'也不会导致错误。

特别是回答“是否有一种单行方式可以做到这一点?”

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

……嗯,你问;-)

但是,您应该考虑,从dict中删除对象的这种方式不是原子的。在if语句期间,“key”可能在my_dict中,但可能在执行del之前被删除,在这种情况下,del将失败,并出现KeyError。鉴于此,使用dict.pop或类似于

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

当然,这绝对不是一句话。

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

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

您可以按条件删除。如果密钥不存在,则无错误。

我更喜欢不可变的版本

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}

要删除键而不管它是否在字典中,请使用dict.pop()的双参数形式:

my_dict.pop('key', None)

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

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

del my_dict['key']

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