【问题标题】:Using list comprehension for repeated function calls in Python [duplicate]在Python中对重复的函数调用使用列表推导[重复]
【发布时间】:2017-07-07 10:53:54
【问题描述】:

在我当前的代码库中,我有以下行,其中 to_remove 是一个集合

 [to_remove.update(b) for b in some_set if all(a <= b for a in some_dict)]

虽然它有效,但它有点困扰我,因为它创建了一个未使用的None 列表。它被认为不标准吗?有没有更好的方法?

更新:

由于有人指出仅针对副作用的列表理解不好,我已将代码更改为

to_remove.update(itertools.chain.from_iterable(
    b for b in some_set if all(a <= b for a in some_dict))

【问题讨论】:

  • 列表解析中的副作用是不寻常且出乎意料的,这使它们成为一个非常糟糕的主意。应该避免任何让人们感到困惑并且有更直接的实现的东西。
  • 一个普通的for循环和一个if语句?
  • 你必须这样做to_remove.update([b for b in some_set if all(a &lt;= b for a in some_dict)])
  • @A-B-B 啊,你把它变成了一个可迭代的。是的,这很好,虽然可能会让 (Python) 初学者感到困惑。

标签: python list-comprehension


【解决方案1】:

如果其输出未分配给变量,则不标准或不建议使用列表推导式。 pylint 之类的静态分析器甚至会标记它。

改用常规循环:

for b in some_set:
    if all(a <= b for a in some_dict):
        to_remove.update(b)

在您的具体情况下,由于 to_remove 是一个集合,以下可能会或可能不会正常工作:

to_remove.update(b for b in some_set if all(a <= b for a in some_dict))

【讨论】:

  • to_remove.update(b for b in some_set if all(a &lt;= b for a in some_dict)) 没有给出相同的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多