【问题标题】:List/Conditional Comprehension in PythonPython中的列表/条件理解
【发布时间】:2016-10-12 23:22:55
【问题描述】:

我想知道如何将以下内容转化为理解:

for g in a:
    for f in g[::3]:
        if f == clf.best_params_:
            print g

我试过了:

p = [[print g for g in a] if f==clf.best_params for f in [g[::3] for g in a]]
p

但在for f in 出现错误

希望得到一些帮助!谢谢!

【问题讨论】:

  • 一般来说,带有副作用(如打印)的循环不适合被理解为...
  • 你知道 print 返回 None?
  • @leaf -- 看起来 OP 在 python2.x 上,其中 print 是一个语句(当然,禁止 __future__ 导入)。
  • @mgilson 开枪!我总是想念那个。
  • 理解是一种创建列表的方法,而不是简单地重复做某事,for循环已经是Pythonic =)

标签: python list scikit-learn conditional list-comprehension


【解决方案1】:

翻译这些循环的正确方法是

[print g for g in a for f in g[::3] if f == clf.best_params_]

然而,在 Python 2 中,print g 是一个语句,这就是你得到一个 SyntaxError 的原因。 Python 3 对应项(即print(g))可以工作,但请注意这里的列表推导完全没用。当您必须将值收集到列表中时,列表推导式很有用 - 在这里它只会妨碍可读性。

关于 SyntaxError,这不是这里的主要问题。请注意,您可以使用

from __future__ import print_function

然后像在 Python 3 中一样在列表推导中使用 print() 函数。

【讨论】:

  • 感谢您的回答!清晰度非常有帮助,很高兴听到打印的 SyntaxError 清晰。我的意图是存储一个列表,而不是打印,但在检查循环是否有效时,我不小心留下了打印语句。
  • @FlowNuwen 很高兴我能帮上忙。如果您的意图是存储一个列表,那么我最初写的是您如何编写列表推导式:所有的 for 循环一个接一个,最里面的 if 语句在最后。请注意,要么有一个 if 语句,要么没有。列表推导式中不能有多个 if 语句。
【解决方案2】:

我认为你混淆了这个结构:它是一个列表推导式,而不是某种宏。

你不会得到这种副作用;列表推导的目的是构造一个列表。

【讨论】:

  • 确实得到了副作用。然后列表中充满了无用的值。另一方面,我同意你的观点,这里完全滥用了列表推导式。
  • 您可以在列表推导中获得副作用,例如。改变列表,但这是非常糟糕的做法。此示例尝试使用 print statement 这甚至不是正确的语法
【解决方案3】:

规则 1 - 保持 forif 部分的顺序相同。唯一改变顺序的部分是最后一部分,print g: 移动到前面。

[print g for g in a for f in g[::3] if f == clf.best_params_]

规则 2 - 列表推导不应该任何事情。而不是打印 g,让g 是累积的值。

[g for g in a for f in g[::3] if f == clf.best_params_]

如果您的整个目标只是打印内容,请坚持使用原始循环;列表推导不会增加任何价值。


如果我们再看看您原来的嵌套循环,可能会有更好的方法来编写它们。您的目标是找到在匹配位置之一具有clf.best_params_ 的所有项目g?如果是这样,我建议用单个 if any 语句替换内部循环。

for g in a:
    if any(f == clf.best_params_ for f in g[::3]):
        print g

对我来说,这读起来更好。逻辑更清晰。如果clf.best_params_ 多次出现,它将只打印一次g 的任何一个值,而不是多次。

如果这是一种改进,那么您可以将该版本转换为列表理解,如下所示:

[g for g in a if any(f == clf.best_params_ for f in g[::3])]

【讨论】:

  • 请问这些规则的来源
  • 第一个是简单的转换是如何工作的。第二个与其说是“规则”,不如说是最佳实践。我把它当作一条规则:我从不写有副作用的列表推导。
  • 谢谢!我的本意不是打印,但我只是将其放入以检查它是否正常工作。
猜你喜欢
  • 2020-05-29
  • 2012-05-03
  • 2022-11-23
  • 2018-04-11
  • 2020-01-07
  • 1970-01-01
  • 2016-09-18
  • 2020-08-27
  • 2014-08-17
相关资源
最近更新 更多