2464

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

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

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

4

15 回答 15

3942

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

my_dict.pop('key', None)

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

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

del my_dict['key']

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

于 2012-06-30T20:29:18.237 回答
414

具体回答“有没有一种方法可以做到这一点?”

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

...好吧,你了;-)

但是,您应该考虑到,这种从 a 中删除对象的dict方式不是原子的——它可能'key'在语句my_dict期间存在if,但可能在del执行之前被删除,在这种情况下del将失败并返回 a KeyError。鉴于此,使用dict.pop或类似的东西是最安全的

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

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

于 2012-06-30T20:36:44.680 回答
181

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

pop(key[, default])

如果key在字典中,删除它并返回它的值,否则返回default。如果未给出默认值且不在字典中,KeyError则引发 a。

文档

于 2013-03-04T16:43:20.967 回答
74

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). del两者都至少比try/except语句快三倍:

>>> 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
于 2016-12-07T12:19:22.867 回答
60

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

或 in python3,您必须改用列表推导:

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

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

于 2015-09-16T19:17:36.957 回答
49

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

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

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

于 2016-12-07T05:52:11.343 回答
19

使用“del”关键字:

del dict[key]
于 2018-05-02T10:22:55.467 回答
9

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

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

如果您觉得这很有用,请分叉此要点以供将来参考。

于 2018-05-19T10:09:13.067 回答
8

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

try: 
    del dict[key]

except KeyError: pass

pop()但是,如果密钥不存在,这将比该方法慢。

my_dict.pop('key', None)

几个键无关紧要,但如果你反复这样做,那么后一种方法是更好的选择。

最快的方法是这样的:

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

但是这种方法很危险,因为如果'key'在两行之间删除, aKeyError将被提高。

于 2019-05-25T04:06:20.077 回答
5

另一种方法是使用 items() + dict理解。

items() 与dict理解相结合也可以帮助我们完成键值对删除的任务,但它的缺点是不是一个到位的dict技术。实际上,如果创建了一个新的字典,除了我们不希望包含的键。

test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}

# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))

# Using items() + dict comprehension to remove a dict. pair
# removes  vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}

# Printing dictionary after removal
print ("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}
于 2019-09-17T19:25:16.597 回答
5

字典数据类型有一个被调用的方法dict_name.pop(item),它可以用来从字典中删除一个键:值对。

a={9:4,2:3,4:2,1:3}
a.pop(9)
print(a)

这将使输出为:

{2: 3, 4: 2, 1: 3}

这样,您可以在一行中从字典中删除一个项目。

于 2020-06-21T09:24:22.347 回答
3

我更喜欢不可变的版本

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}
于 2019-06-14T08:44:33.517 回答
3

按键上的单个过滤器

  • 如果 my_dict 中存在“key”,则返回“key”并将其从 my_dict 中删除
  • 如果 my_dict 中不存在“key”,则返回 None

这将my_dict就地改变(可变)

my_dict.pop('key', None)

键上的多个过滤器

生成一个新的字典(不可变)

dic1 = {
    "x":1,
    "y": 2,
    "z": 3
}

def func1(item):
    return  item[0]!= "x" and item[0] != "y"

print(
    dict(
        filter(
            lambda item: item[0] != "x" and item[0] != "y", 
            dic1.items()
            )
    )
)
于 2020-04-25T16:36:47.633 回答
-1

您还可以使用filterwith lambda

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> dict(filter(lambda x: x[0] != 'a', d.items()))
{'b': 2, 'c': 3}
>>>
于 2021-09-12T02:15:21.623 回答
-1

试试这个

if key in data:
   del data[key]
于 2022-02-21T16:24:07.683 回答