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

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

其他回答

delmy_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)稍快。在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

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

my_dict.pop('key', None)

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

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

del my_dict['key']

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

我更喜欢不可变的版本

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}

如果希望非常详细,可以使用异常处理:

try: 
    del dict[key]

except KeyError: pass

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

my_dict.pop('key', None)

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

最快的方法是:

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

但这种方法很危险,因为如果在两行之间删除“key”,就会引发KeyError。

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

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

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