如果键存在则删除字典项[重复]

Posted

技术标签:

【中文标题】如果键存在则删除字典项[重复]【英文标题】:Delete a dictionary item if the key exists [duplicate] 【发布时间】:2013-03-02 21:50:54 【问题描述】:

只有在给定键存在的情况下,有没有其他方法可以删除字典中的项目,除了:

if key in mydict:
    del mydict[key]

场景是我得到了一组要从给定字典中删除的键,但我不确定它们是否都存在于字典中。以防我错过更有效的解决方案。

【问题讨论】:

@user1929959 不,该问题需要字典的副本,并且不关心密钥不在输入中的情况。 【参考方案1】:

你可以使用 dict.pop:

 mydict.pop("key", None)

请注意,如果没有给出第二个参数,即None,则如果键不在字典中,则会引发KeyError。提供第二个参数可防止条件异常。

【讨论】:

作为参考,.pop() 的第二个参数是它在找不到密钥时返回的值。 这是否只进行 1 次查找? 它进行 2 次查找 那么,为了好奇,源代码中第二个参数的默认值是多少? @CarlosPinzón 没有。见the docs。 D.pop(key[, default]) "如果未找到 key,则返回 default,否则引发 KeyError"。【参考方案2】:

还有:

try:
    del mydict[key]
except KeyError:
    pass

这仅进行 1 次查找而不是 2 次。但是,except 子句很昂贵,因此如果您最终经常使用 except 子句,这可能会比您已有的效率低。

【讨论】:

那是我的恐惧。我不确定每次删除两次查找的成本与使用 try-except 的成本。 @SimonHughes -- 见this answer 程序员... 这称为eaiser to ask for forgiveness than permission (EAFP) Python 样式。 而 EAFP 是 Python 中推荐的方法。我想看看“除了条款很昂贵”这句话的证据和理由。 @Bobort -- 这在很多地方都得到了很好的解释。请参阅程序员的this answer 或python 邮件列表上的this response。简而言之,设置 try/except 块很便宜,但处理异常的成本较低。【参考方案3】:

方法:计算要删除的键,改变dict

让我们称keys 为您要删除的键的列表/迭代器。我会这样做:

keys_to_remove = set(keys).intersection(set(mydict.keys()))
for key in keys_to_remove:
    del mydict[key]

您预先计算所有受影响的项目并对其进行操作。

方法:计算要保留的键,用这些键创建新的字典

我更喜欢创建一个新字典而不是改变现有字典,所以我可能也会考虑这个:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = k: v for k, v in mydict.iteritems() if k in keys_to_keep

或:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = k: mydict[k] for k in keys_to_keep

【讨论】:

第一种方法对我来说看起来不是线程安全的

以上是关于如果键存在则删除字典项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果键不存在,则字典返回默认值[重复]

测试一个键是不是存在于字典中,如果 [重复] 则在相同的情况下进行另一个测试

如果字典键不可用,则返回 None

在Python中删除可能存在或不存在的字典属性[重复]

如果字典中存在键,则运行关键字(机器人框架)

从数组中删除(不准确)NSDictionaries 的重复项