Python中的列表/条件理解

时间:2016-10-12 23:22:55

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

我想知道如何理解以下内容:

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

时出错

会喜欢一些帮助!谢谢!

3 个答案:

答案 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 - 保持forif部分的顺序相同。改变顺序的唯一部分是最后一部分,print g:移动到前面。

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

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

[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])]