Logiczne and
dla wszystkich elementów w a_list
:
all(a_list)
Logiczne or
dla wszystkich elementów w a_list
:
any(a_list)
Jeśli czujesz się kreatywny, możesz również:
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)
pamiętaj, że nie są one oceniane w zwarciu, podczas gdy wbudowane są ;-)
inny zabawny sposób:
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
i jeszcze jeden:
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
i moglibyśmy iść cały dzień, ale tak, pythonowym sposobem jest użycie all
i any
:-)
Nawiasem mówiąc, Python nie ma ograniczonej eliminacji rekurencji, więc nie próbuj bezpośrednio tłumaczyć kodu LISP ;-)
reduce()
jestfunctools
od czasu Pythona 3.0ANDing i ORing są łatwe:
>>> 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
Notowanie jest również dość łatwe:
>>> [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]
Oczywiście sposób wykorzystania tych wyników może wymagać interesujących zastosowań twierdzenia DeMorgana.
źródło
all(not x for x in some_list)
(ale to to samo, conot any(some_list)
(całkiem naturalne wyrażenie, co?)).Reduce może to zrobić:
reduce(lambda a,b: a and b, alist, True)
Jak wspomniano w Fortran, wszystko jest najbardziej zwięzłe. Ale skróć odpowiedzi do bardziej ogólnego pytania "Jak zastosować operator logiczny do wszystkich elementów na liście Pythona?"
źródło
reduce
jestfunctools.reduce
w Pythonie 3, True
, ta odpowiedź będzie jedyną faktycznie równoważną kodowi pytania, dla list innych niż logiczne.Idiomem takich operacji jest użycie
reduce
funkcji (globalnej w Pythonie 2.X, w modulefunctools
w Pythonie 3.X) z odpowiednim operatorem binarnym pobranym zoperator
modułu lub zakodowanym jawnie. W twoim przypadku to jestoperator.and_
reduce(operator.and_, [True, True, False])
źródło
Oto inne rozwiązanie:
def my_and(a_list): return not (False in a_list) def my_or(a_list): return True in a_list
Operacja AND na wszystkich elementach zwróci True, jeśli wszystkie elementy są True, stąd na liście nie ma False. ORing jest podobny, ale powinien zwrócić True, jeśli na liście znajduje się co najmniej jedna wartość True.
źródło
Jak pokazują inne odpowiedzi, istnieje wiele sposobów wykonania tego zadania. Oto kolejne rozwiązanie wykorzystujące funkcje z biblioteki standardowej:
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)
źródło