我想知道如何理解以下内容:
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
会喜欢一些帮助!谢谢!
答案 0 :(得分:2)
翻译这些循环的正确方法是
[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
然后在列表推导中使用print()
函数,就像在Python 3中一样。
答案 1 :(得分:1)
我认为你混淆了构造:它是一个列表理解,而不是某种宏。
你没有这种副作用;列表理解的目的是构建一个列表。
答案 2 :(得分:1)
规则1 - 保持for
和if
部分的顺序相同。改变顺序的唯一部分是最后一部分,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_]
如果您的整个目标只是打印东西,请坚持使用原始循环;列表理解不会添加任何值。
如果我们再看看你原来的嵌套循环,可能有更好的方法来编写它们。您的目标是找到在其中一个匹配位置g
的所有项clf.best_params_
吗?如果是这样,我建议用一个if any
语句替换内部循环。
for g in a:
if any(f == clf.best_params_ for f in g[::3]):
print g
对我来说,这读起来更好。逻辑更清晰。如果g
多次出现,它只会打印clf.best_params_
一次的任意值,而不会打印多次。
如果这是一项改进,那么您可以将该版本转换为列表理解,如下所示:
[g for g in a if any(f == clf.best_params_ for f in g[::3])]