【问题标题】:Python: how to delete key from one dictionary if it does not exist in another dictionary? [duplicate]Python:如果另一个字典中不存在,如何从一个字典中删除键? [复制]
【发布时间】:2016-07-07 20:23:47
【问题描述】:

我有两个字典,键是字符串,值是整数:

ground = {"url1":1,"url2":2,....}
prediction = {"url1":5,"url2":3,....}

如果 prediction 中不存在 ground 中的键,我想做的是删除它。

我写了最简单的事情:

for key in ground:        
    if key not in prediction:
        del ground[key]

也试过这个:

for key in ground:
    if not key in prediction.keys():
        del ground[key]

都没有用。我怎样才能实现目标?

【问题讨论】:

  • 没有如何?至少,第二个对我来说很好。
  • @DanielRoseman 字典在迭代期间无法更改其大小。这会引发 RuntimeError(在 python 2.7 上)
  • 第一个可以,是的。但不是第二个。
  • 第二个可以引发同样的异常。出于同样的原因。请参阅下面的回复。

标签: python dictionary compare key del


【解决方案1】:

您循环遍历 dict 并删除同一循环内的一个键。这就是为什么它可能不起作用。试试:

pred_set = set(prediction.keys())
g_set = set(ground.keys())
for key in g_set - pred_set:
    del ground[key]

【讨论】:

    【解决方案2】:

    您的第二次尝试在 Python 2 中运行良好。在 Python 3 中,keys() 是一个视图而不是一个列表,因此会给出与第一次相同的错误:字典在迭代期间更改了大小。要解决此问题,请先将其转换为列表:

    for key in list(ground.keys()):
      if key not in prediction:
        del ground[key]
    

    【讨论】:

    • 谢谢。现在效果很好
    【解决方案3】:

    您可以使用字典推导来创建一个新字典:

    ground = {k: ground[k] for k in ground if k in prediction}
    

    或者在 Python 2 中使用 ground.keys() 或在 Python 3 中使用 list(ground.keys()) 迭代 ground 字典的键(也适用于 Python 2)。这将返回一个新列表,当从 ground 字典中删除键时,该列表不会受到影响:

    for k in list(ground.keys()):
        if k not in prediction:
            del ground[k]
    

    【讨论】:

    • 字典理解应该是ground = {k: ground[k] for k in ground if k not in prediction}
    • @loutre:差不多。我原来的答案是错误的,但你的逻辑是颠倒的。
    猜你喜欢
    • 2017-07-06
    • 2022-08-08
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2020-08-27
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多