Как применить логический оператор ко всем элементам в списке python


У меня есть список логических значений в python. Я хочу И (ИЛИ ИЛИ ИЛИ НЕТ) их и получить результат. Следующий код работает, но не очень подходящие для Python.

def apply_and(alist):
 if len(alist) > 1:
     return alist[0] and apply_and(alist[1:])
 else:
     return alist[0]

какие-либо предложения о том, как сделать это более подходящие для Python приветствуется.

6 55

6 ответов:

логическое and по всем элементам в a_list:

all(a_list)

логическое or по всем элементам в a_list:

any(a_list)

если вы чувствуете себя творческим, вы можете также сделать:

import operator
def my_all(a_list):
  return reduce(operator.and_, a_list, True)

def my_any(a_list):
  return reduce(operator.or_, a_list, False)

имейте в виду, что они не оцениваются в коротком замыкании, в то время как встроенные модули; -)

еще один забавный способ:

def my_all_v2(a_list):
  return len(filter(None,a_list)) == len(a_list)

def my_any_v2(a_list):
  return len(filter(None,a_list)) > 0

и еще:

def my_all_v3(a_list):
  for i in a_list:
    if not i:
      return False
  return True

def my_any_v3(a_list):
  for i in a_list:
    if i:
      return True
  return False

и мы могли бы пойти на весь день, Но да, весть способ заключается в использовании all и any : -)

кстати, Python не имеет исключения хвостовой рекурсии, поэтому не пытайтесь напрямую переводить код LISP; -)

Андинг и оринг легко:

>>> some_list = [True] * 100
# OR
>>> any(some_list)
True
#AND
>>> all(some_list)
True
>>> some_list[0] = False
>>> any(some_list)
True
>>> all(some_list)
False

отметить также довольно легко:

>>> [not x for x in some_list]
[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]

уменьшить можно сделать так:

reduce(lambda a,b: a and b, alist, True)

как упоминал Фортран, все это самый краткий способ сделать это. Но сократите ответы на более общий вопрос "как применить логический оператор ко всем элементам в списке python?"

идиома для таких операций заключается в использовании reduce функция (глобальная в Python 2.Х, в модуле functools в Python 3.X) с соответствующим двоичным оператором либо взятым из operator модуль или явно закодированы. В вашем случае, это operator.and_

reduce(operator.and_, [True, True, False])

вот еще одно решение:

def my_and(a_list):
    return not (False in a_list)

def my_or(a_list):
    return True in a_list

логического умножения всех элементов будет возвращать true, если все элементы являются подлинными, поэтому никаких ложных в список. ORing аналогичен, но он должен возвращать True, если хотя бы одно истинное значение присутствует в списке.

Как показывают другие ответы, существует несколько способов выполнения этой задачи. Вот еще одно решение, которое использует функции из стандартной библиотеки:

from functools import partial

apply_and = all
apply_or = any
apply_not = partial(map, lambda x: not x)

if __name__ == "__main__":
    ls = [True, True, False, True, False, True]
    print "Original: ", ls
    print "and: ", apply_and(ls)
    print "or: ", apply_or(ls)
    print "not: ", apply_not(ls)