如果密钥存在,则删除字典项

Sim*_*hes 232 python python-2.7

除了给定的密钥存在之外,还有其他方法可以删除字典中的项目,除了:

if key in mydict:
    del mydict[key]
Run Code Online (Sandbox Code Playgroud)

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

Ade*_*taş 503

你可以使用: dict.pop

 mydict.pop("key", None)
Run Code Online (Sandbox Code Playgroud)

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

  • 作为参考,`.pop()`的第二个参数是如果找不到键则返回的. (25认同)
  • @CarlosPinzón 没有。请参阅[文档](https://docs.python.org/3/library/stdtypes.html#dict.pop)。`D.pop(key[, default])` “如果找不到 `key`,则返回 `default`(如果给定),否则会引发 `KeyError`”。 (3认同)
  • 它进行 2 次查找 (2认同)

mgi*_*son 12

还有:

try:
    del mydict[key]
except KeyError:
    pass
Run Code Online (Sandbox Code Playgroud)

这只执行1次查找而不是2次.但是,except子句很昂贵,所以如果你最终经常点击except子句,这可能会比你已经拥有的效率低.

  • @SimonHughes - 在程序员身上看到[这个答案](http://programmers.stackexchange.com/questions/175655/python-forgiveness-vs-permission-and-duck-typing/175663#175663) (3认同)
  • 而 EAFP 是 Python 中推荐的方法。我想看看“除非条款很昂贵”这一说法的证据和理由。 (3认同)
  • @Bobort——这在很多地方都得到了很好的解释。请参阅有关程序员的[此答案](http://softwareengineering.stackexchange.com/questions/175655/python-forgiveness-vs-permission-and-duck-typing/175663#175663)或[此回复](https:// mail.python.org/pipermail/tutor/2011-January/081143.html) 在 python 邮件列表中。简而言之,设置 try/ except 块很便宜,但处理异常则不太便宜。 (3认同)
  • 这被称为[更容易请求宽恕而不是许可](https://docs.python.org/3/glossary.html#term-eafp) (EAFP) Python 风格。 (2认同)

hug*_*own 5

方法:计算键以删除,变异字典

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

keys_to_remove = set(keys).intersection(set(mydict.keys()))
for key in keys_to_remove:
    del mydict[key]
Run Code Online (Sandbox Code Playgroud)

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

方法:计算要保留的密钥,并用这些密钥做出新的决定

我更喜欢创建一个新字典,而不是对现有字典进行变异,因此我可能还会考虑以下问题:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: v for k, v in mydict.iteritems() if k in keys_to_keep}
Run Code Online (Sandbox Code Playgroud)

要么:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: mydict[k] for k in keys_to_keep}
Run Code Online (Sandbox Code Playgroud)