【问题标题】:Python deleting from a dictionary using list comprehensionsPython使用列表推导从字典中删除
【发布时间】:2012-08-08 10:00:41
【问题描述】:

我正在努力成为一名优秀的 pythonista 并尽可能使用列表推导......

为什么这不起作用?

[del my_dict[r] for r in to_remove]

目标是从我的dict对象my_dict中删除列表to_remove中的条目 这个:

for r in to_remove:
  del my_dict[r]

工作正常,但我正在尝试使用列表推导来做到这一点

【问题讨论】:

  • 列表理解用于从旧列表创建新列表,可能会检查条件。对于您的使用,您应该使用循环。
  • @andy boot,看在 pythonista 的份上,请阅读PEP8

标签: python


【解决方案1】:

您不应该对副作用使用列表推导,它不是 Pythonic。

应该使用简单的 for 循环。

【讨论】:

    【解决方案2】:

    因为del X 是一个不应该这样使用的语句。它在语法上是不正确的。

    只是:

    for r in to_remove:
        del my_dict[r]
    

    【讨论】:

    • +1 这应该是公认的答案,因为它提到了真正的原因
    【解决方案3】:
    1. 你没有从这里的列表理解中获得任何东西,因为你不是在寻找一个新的列表。
    2. del 不是函数,因此您不能将其作为列表理解的一部分来调用。

    基本上,只需遍历列表即可:

    for r in to_remove:
        del my_dict[r]
    

    【讨论】:

      【解决方案4】:

      可以这样做,但我会听 jamylak。当然,这是返回一个 new 列表,而不是从 my_dict

      中删除
      my_dict = [x for x in my_dict if x not in to_remove]
      

      【讨论】:

      • 这也可以通过集合来完成,例如set(my_dict.keys()).difference(to_remove)
      • 我只是给 OP 一个选项来查看。我明确提到这不是一个好方法,问题是关于列表理解。不过感谢set 选项,我之前从未使用过difference 函数。
      • 完全同意,只是评论一下,以防你没有以这种方式使用过套装:)
      【解决方案5】:

      你可以这样做:

      [my_dict.pop(r) for r in to_remove]
      

      .pop 返回已删除键的值,它会比del (see here) 慢一点,而不是最“pythonic”的方式来做到这一点。所以你可能不应该像其他人建议的那样。

      【讨论】:

        猜你喜欢
        • 2016-04-01
        • 2016-02-04
        • 2021-05-01
        • 2020-07-14
        • 2020-05-07
        • 2010-11-17
        • 1970-01-01
        相关资源
        最近更新 更多