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


90

파이썬에 부울 목록이 있습니다. 나는 그들을 AND (또는 OR 또는 NOT)하고 결과를 얻고 싶습니다. 다음 코드는 작동하지만 그다지 비단 해지지는 않습니다.

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

더 비단뱀처럼 만드는 방법에 대한 제안.

답변:


176

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 코드를 직접 번역하지 마십시오 ;-)


8
operator.and_는 논리 AND가 아닌 비트 및 연산자 &입니다.
Ants Aasma

1
운 좋게도 True와 False (원하는대로)는 각각 1과 0으로 캐스트되므로 비트 연산자는 논리 ^ _ ^로 작동합니다.
fortran

6
많은 중복 버전을 설명했지만 실제 정답에 대한 구문을 제공하지 않았습니다.
jwg 2013 년

2
원하는 것이 무엇이든 동의하지 않으면 FAQ에 있습니다 : stackoverflow.com/privileges/vote-down
fortran

2
reduce()functools파이썬 3.0 이후
던컨 WP

33

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 정리의 흥미로운 응용 프로그램이 필요할 수 있습니다.


4
not variant의 단락을 원하면 생성기 표현식을 사용하십시오. all(not x for x in some_list)(그러나 이는 not any(some_list)(매우 자연스러운 표현식, 응?))과 동일합니다.
u0b34a0f6ae

16

Reduce 는 다음을 수행 할 수 있습니다.

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

포트란이 언급했듯이 모든 것이 가장 간결한 방법입니다. 그러나보다 일반적인 질문 인 "파이썬 목록의 모든 요소에 논리 연산자를 적용하는 방법은 무엇입니까?"


4
감소는 사라지지 않습니다, AFAIK. 글로벌 네임 스페이스의 이전 위치에서 functools 모듈로 이동 중입니다
Eli Bendersky

1
@eliben : 왜 미래형으로 파이썬 3에 대해 이야기합니까? 감소가 여전히 있습니다 .reduce이다 functools.reduce 파이썬 3
u0b34a0f6ae

를 제거하면 , True부울이 아닌 목록의 경우이 답변이 실제로 질문의 코드와 동일한 유일한 답변이됩니다.
Thomas Ahle 2016-08-20

10

이러한 작업의 관용구 reduce는 모듈 functools에서 가져 operator오거나 명시 적으로 코딩 된 적절한 이진 연산자와 함께 함수 (Python 2.X의 전역, Python 3.X의 모듈 )를 사용하는 것입니다 . 귀하의 경우에는operator.and_

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

4

다른 해결책은 다음과 같습니다.

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를 반환해야합니다.


0

다른 답변에서 알 수 있듯이이 작업을 수행하는 방법에는 여러 가지가 있습니다. 다음은 표준 라이브러리의 함수를 사용하는 또 다른 솔루션입니다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.