我正在运行Python 3。

是否可以在elif的条件中放入循环?这是我要实现的基本思想。列表中的项目数不是恒定的。

if some_condition:
    do this
elif [ x.method() for x in list ]:
    do this to x
else:
    do something else


现在,这浮现在我的脑海:

if some_condition:
    do this
for x in list:
    if x.method():
        do this to x
        break


但是我试图避免运行所有的if语句,它们中有很多东西。我想在elif部分而不是在else中获得它。

编辑/更多说明:

看来我需要的是any( x.method() for x in list ),而且还要引用x,以便在条件为真时可以使用x

这是我要重新获得的整个概念:

if condition:
    do this
elif list[0].method():
    do this to list[0]
elif list[1].method():
    do this to list[1]
...
elif list[n].method():
    do this to list[n]
else:
    do this


其中method()是返回TrueFalse的某种方法,而n是列表的大小而不是常量。

最佳答案

我认为您想要的-完全包含在elif中-是不可能的。您必须评估列表中是否存在any这样的值,然后在条件中将其绑定到x。据我所知,这在Python的语法中是不可能的。 You can not do an assignment in the condition,虽然列表理解中的循环变量可以“泄漏”到外部作用域,但对于生成器而言并非如此。

>>> if any(x for x in range(10) if x >= 5):
...     print x
NameError: name 'x' is not defined
>>> if any([x for x in range(10) if x >= 5]):
...     print x
9


在第二种情况(列表)中,我们引用了x,但它是整个列表中的最后一个值,在第一种情况(生成器)中,根本无法解析x



相反,这是另一个变体,使用生成器表达式将forif组合在一起,并在else中添加for以枚举最终的else子句。

if some_condition:
    print "do this"
else:
    for x in (x for x in lst if foo(x)):
        print "do this to", x
        break
    else:
        print "do something else"

07-26 05:26