我正在运行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()
是返回True
或False
的某种方法,而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
。相反,这是另一个变体,使用生成器表达式将
for
与if
组合在一起,并在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"