[python] 파이썬 목록의 모든 요소에 논리 연산자를 적용하는 방법

파이썬에 부울 목록이 있습니다. 나는 그들을 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

우리는 모든 일에 갈 수 있지만, 예, 파이썬 방법은 사용하는 것입니다 allany🙂

그건 그렇고, 파이썬에는 꼬리 재귀 제거 기능이 없으므로 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)


답변