Как применить логический оператор ко всем элементам в списке 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 ответов:
логическое
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)