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

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

if key in mydict:
    del mydict[key]

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

【问题讨论】:

  • @user1929959 不,该问题需要字典的副本,并且不关心密钥不在输入中的情况。

标签: python python-2.7


【解决方案1】:

你可以使用 dict.pop:

 mydict.pop("key", None)

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

【讨论】:

  • 作为参考,.pop() 的第二个参数是它在找不到密钥时返回的值。
  • 这是否只进行 1 次查找?
  • 它进行 2 次查找
  • 那么,为了好奇,源代码中第二个参数的默认值是多少?
  • @CarlosPinzón 没有。见the docsD.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}

【讨论】:

  • 第一种方法对我来说看起来不是线程安全的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2017-07-04
  • 2011-02-05
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多