1

我想做这样的事情:

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)

但这可能不是最好的解决方案,原因也在这个 SO question中给出。正如我提到的另一个线程,我当然可以使用基于那里给出的解决方案的代码,例如

x = next((f(x) for x in a if f(x)), False)

但我没有看到一种简单的方法来规避当时的双重召唤f

有没有我遗漏或不知道的简单解决方案?像一个

OR((f(x) for x in a))

也许?

我试图找到与此相关的其他问题,但是or在 SO 中搜索关键字 like 有点问题,所以也许我只是没有找到合适的东西。

4

2 回答 2

2

这应该有效:

next((x for y in a for x in (f(y),) if x),False)
于 2013-08-13T12:24:04.507 回答
0

我现在正在使用这个:

x = next((v for v in (f(x) for x in a) if v), False)

这是一个有效的习语,没有加倍调用,f也没有引入 hacky local,但它仍然不是很可读(尤其是如果x, f, a, andv长于一个字母)。

我很高兴听到更好的解决方案。

于 2013-08-13T13:50:03.087 回答