파이썬에 부울 목록이 있습니다. 나는 그들을 AND (또는 OR 또는 NOT)하고 결과를 얻고 싶습니다. 다음 코드는 작동하지만 그다지 비단 해지지는 않습니다.
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
더 비단뱀처럼 만드는 방법에 대한 제안.
답변
의 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
🙂
그건 그렇고, 파이썬에는 꼬리 재귀 제거 기능이 없으므로 LISP 코드를 직접 번역하지 마십시오 😉
답변
ANDing 및 ORing은 쉽습니다.
>>> 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]
물론 이러한 결과를 어떻게 사용하려면 DeMorgan 정리의 흥미로운 응용 프로그램이 필요할 수 있습니다.
답변
Reduce 는 다음을 수행 할 수 있습니다.
reduce(lambda a,b: a and b, alist, True)
포트란이 언급했듯이 모든 것이 가장 간결한 방법입니다. 그러나보다 일반적인 질문 인 “파이썬 목록의 모든 요소에 논리 연산자를 적용하는 방법은 무엇입니까?”
답변
이러한 작업의 관용구 reduce
는 모듈 functools
에서 가져 operator
오거나 명시 적으로 코딩 된 적절한 이진 연산자와 함께 함수 (Python 2.X의 전역, Python 3.X의 모듈 )를 사용하는 것입니다 . 귀하의 경우에는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
AND는 모든 요소가 True이면 True를 반환하므로 목록에 False가 없습니다. ORing은 비슷하지만 목록에 True 값이 하나 이상 있으면 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)