我想做这样的事情:
x = f(a[0]) or f(a[1]) or f(a[2]) or f(a[3]) or …
具有给定列表a
和给定函数f
。与内置的any
函数不同,我需要获取列表的第一个值,该值被认为是真的;所以对于0 or "foo" or 3.2
,我需要"foo"
,而不仅仅是True
。
当然,我可以写一个像
这样的小函数def returnFirst(f, a):
for i in a:
v = f(i)
if v:
return v
return False
x = returnFirst(f, a)
但这可能不是最好的解决方案,原因也在this SO question中给出。当我提到这个其他线程时,我当然可以使用基于的代码 在那里给出的解决方案,例如
x = next((f(x) for x in a if f(x)), False)
但我没有看到一种简单的方法可以绕过f
的双倍调用。
我缺少任何简单的解决方案或者只是不知道?像
这样的东西OR((f(x) for x in a))
可能?
我试图找到有关此问题的其他问题,但搜索or
这样的关键字在SO中有点问题,所以也许我找不到合适的东西。
答案 0 :(得分:2)
这应该有效:
next((x for y in a for x in (f(y),) if x),False)
答案 1 :(得分:0)
我现在正在使用它:
x = next((v for v in (f(x) for x in a) if v), False)
这是一个有用的成语,没有加倍f
的调用,也没有引入一个hacky本地,但它仍然不是很易读(特别是x
,f
,{{1} },a
超过一个字母。)
我很高兴听到更好的解决方案。