14

如何将“或”应用于 Python 中列表的所有值?我在想类似的事情:

or([True, True, False])

或者如果可能的话:

reduce(or, [True, True, False])
4

5 回答 5

31

内置函数any可以满足您的要求:

>>> any([True, True, False])
True
>>> any([False, False, False])
False
>>> any([False, False, True])
True

anyreduce一旦找到真值,它的优势在于可以缩短序列中后面项目的测试。如果序列是一个后面有昂贵操作的生成器,这将非常方便。例如:

>>> def iam(result):
...  # Pretend this is expensive.
...  print "iam(%r)" % result
...  return result
... 
>>> any((iam(x) for x in [False, True, False]))
iam(False)
iam(True)
True
>>> reduce(lambda x,y: x or y, (iam(x) for x in [False, True, False]))
iam(False)
iam(True)
iam(False)
True

如果您的 Python 版本没有any(), all()builtins,那么它们很容易按照Guido van Rossum 的建议实现:

def any(S):
    for x in S:
        if x:
            return True
    return False

def all(S):
    for x in S:
        if not x:
            return False
    return True
于 2008-12-20T19:16:37.163 回答
7

没有人提到它,但是 " or" 可以作为 operator 模块中的一个函数使用:

from operator import or_

然后你可以reduce像上面那样使用。

any尽管在最近的 Python 中,总是会建议“ ”。

于 2008-12-20T19:49:58.873 回答
3
>>> all([True,False,True])
False
>>> any([True,False,True])
True

Python 2.5 及更高版本(文档

于 2008-12-20T19:17:12.233 回答
2

你可以这样做:

reduce(lambda a,b: a or b, [True, True, False])
于 2008-12-20T19:11:38.593 回答
1

reduce 应该为你做,不是吗?

>>> def _or(x, y):
...     return x or y
... 
>>> reduce(_or, [True, True, False])
True
于 2008-12-20T19:12:26.500 回答