应用于列表的快捷方式OR链

时间:2013-08-13 12:09:15

标签: python list

我想做这样的事情:

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中有点问题,所以也许我找不到合适的东西。

2 个答案:

答案 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本地,但它仍然不是很易读(特别是xf,{{1} },a超过一个字母。)

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