Как применить «или» ко всем значениям списка в Python? - PullRequest
14 голосов
/ 20 декабря 2008

Как применить 'или' ко всем значениям списка в Python? Я думаю что-то вроде:

or([True, True, False])

или, если это было возможно:

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

Ответы [ 5 ]

32 голосов
/ 20 декабря 2008

Встроенная функция any делает то, что вы хотите:

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

any имеет преимущество перед reduce в том, что он сокращает тест для более поздних элементов в последовательности, как только он находит истинное значение. Это может быть очень удобно, если последовательность представляет собой генератор с дорогой операцией. Например:

>>> 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(), то они легко реализуются, как Гвидо ван Россум предложил :

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
7 голосов
/ 20 декабря 2008

Никто не упомянул об этом, но «or» доступно как функция в модуле оператора:

from operator import or_

Тогда вы можете использовать reduce, как указано выше.

Всегда советует "any", хотя в более поздних питонах.

3 голосов
/ 20 декабря 2008
>>> all([True,False,True])
False
>>> any([True,False,True])
True

Python 2.5 и выше ( документация )

2 голосов
/ 20 декабря 2008

Вы можете сделать это:

reduce(lambda a,b: a or b, [True, True, False])
1 голос
/ 20 декабря 2008

Снижение должно сделать это для вас, не так ли?

>>> def _or(x, y):
...     return x or y
... 
>>> reduce(_or, [True, True, False])
True
...