如何从Python字典中删除键?

How to remove a key from a Python dictionary?

当试图从字典中删除键时,我会写:

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

有一种单行的方法吗?


使用dict.pop()

1
my_dict.pop('key', None)

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


具体来说,回答"是否有一种单行的方法可以做到这一点?"

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

…嗯,你问;-)

不过,您应该考虑,这种从dict中删除对象的方法不是原子的,可能在if语句期间'key'可能在myDict中,但在执行del之前可以删除,在这种情况下,del将失败,因为KeyError。考虑到这一点,使用dict.pop或其他类似的方法是最安全的。

1
2
3
4
try:
    del myDict['key']
except KeyError:
    pass

当然,这绝对不是一条直线。


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

pop(key[, default])

If key is in the dictionary, remove it and return its value, else
return default. If default is not given and key is not in the
dictionary, a KeyError is raised

文档


上述三种解决方案的时间安排。

小词典:

1
2
3
4
5
6
7
>>> 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

大字典:

1
2
3
4
5
6
>>> 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()非常简洁,并且可以阅读pythonic:

1
2
3
4
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,如下所示:

1
2
3
4
map(lambda x: myDict.pop(x,None), ['a','c','e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

它起作用了。"e"不会导致错误,即使mydict没有"e"键。


用途:

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

另一种方式:

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

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


使用"del"关键字:

1
del dict[key]


我们可以通过以下方法从python字典中删除一个键。

使用del关键字;这与您使用的方法几乎相同-

1
2
3
4
 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不同。

1
2
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,那么我们可以看到所有的键,包括我们用这种方法从字典中排除的键。但是,我们可以通过将以下语句赋给变量来创建新的字典:

1
var = {key:value for key, value in myDict.items() if key != 'one'}

现在,如果我们尝试打印它,那么它将遵循父顺序:

1
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

使用pop()方法。

1
2
3
4
5
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

delpop的区别在于,使用pop()方法,我们可以根据需要实际存储密钥的值,如下所示:

1
2
3
4
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

如果你觉得这个有用的话,把这个要点交出来供将来参考。