如何从 Python 字典中删除键?

从字典中删除键时,我使用:

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

有没有一种方法可以做到这一点?

答案

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

my_dict.pop('key', None)

这将返回my_dict[key]如果key在字典中存在,并None其他。如果未指定所述第二参数(即my_dict.pop('key')key不存在,一个KeyError上升。

要删除肯定存在的密钥,您还可以使用

del my_dict['key']

如果字典中不存在键,则会引发KeyError

专门回答 “是否有一种统一的方法?”

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

... 嗯,你问过 ;-)

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

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

当然,这绝对不是单线的。

我花了一些时间弄清楚my_dict.pop("key", None)到底在做什么。因此,我将其添加为答案以节省其他 Google 搜索时间:

pop(key[, default])

如果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

如果您需要在一行代码中从字典中删除很多键,我认为使用 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 ,必须改为使用列表python3

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

有用。即使 myDict 没有 “e” 键,“e” 也不会引起错误。

采用:

>>> if myDict.get(key): myDict.pop(key)

另一种方式:

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

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

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

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

如果您觉得有用,请叉要点以备将来参考。

如果您想要非常冗长,可以使用异常处理:

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: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}