파이썬에서 부울의 반대 (부정)를 얻으려면 어떻게해야합니까?


106

다음 샘플의 경우 :

def fuctionName(int, bool):
    if int in range(...):
        if bool == True:
            return False
        else:
            return True

두 번째 if 문을 건너 뛸 수있는 방법이 있습니까? 부울의 반대를 반환하도록 컴퓨터에 지시하려면 bool?


6
이것은 아마 의사이지만, int그리고 bool(이 나타내는 유형) 모두 내장의 이름은, 변수 이름으로 사용할 수 없습니다.
SingleNegationElimination 2011-08-11

예, 단지 의사 코드 일뿐입니다. 데모 용으로 만 사용됩니다 ...
amyassin 2011-08-11

7
if x == True:작성해야합니다 if x:.
Mike Graham

답변:


180

다음을 사용할 수 있습니다.

return not bool

4
또한 int in range (....)비효율적입니다. 목록을 만든 다음 선형 검색을 수행합니다. 보다 나은 x in range(low, high)입니다 low <= x < high.
MRAB

참고 not NoneFalse를 반환합니다. 적어도 나를 위해 그것은 내가 기대하는 것이 아닙니다. 나는 기대할 not NoneNone있으므로 not반환 값이있을 경우에도 부정 할 수 있습니다 None. 파이썬에서 구현되는 방식은 실제로 먼저 부울이 있는지 확인해야합니다.
masi

54

not연산자 (논리 부정)

아마도 가장 좋은 방법은 연산자를 사용하는 것입니다 not.

>>> value = True
>>> not value
False

>>> value = False
>>> not value
True

따라서 코드 대신 :

if bool == True:
    return False
else:
    return True

다음을 사용할 수 있습니다.

return not bool

함수로서의 논리적 부정

operator모듈 에는 두 개의 함수 가 있으며 연산자 대신 함수로 필요한 경우 operator.not_별칭 operator.__not__입니다.

>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False

술어 함수 또는 콜백이 필요한 함수를 사용하려는 경우 유용 할 수 있습니다.

예를 들면 map또는 filter:

>>> lst = [True, False, True, False]
>>> list(map(operator.not_, lst))
[False, True, False, True]

>>> lst = [True, False, True, False]
>>> list(filter(operator.not_, lst))
[False, False]

물론 동일한 lambda기능으로 도 동일한 결과를 얻을 수 있습니다 .

>>> my_not_function = lambda item: not item

>>> list(map(my_not_function, lst))
[False, True, False, True]

~부울에 비트 반전 연산자 를 사용하지 마십시오.

비트 반전 연산자 ~또는 동등한 연산자 함수 operator.inv(또는 거기에있는 다른 3 개의 별칭 중 하나) 를 사용하고 싶을 수 있습니다 . 그러나 결과 bool의 하위 클래스 int는 "inverse boolean"을 반환하지 않기 때문에 예기치 않은 결과가 될 수 있기 때문에 "inverse integer"를 반환합니다.

>>> ~True
-2
>>> ~False
-1

그 이유 True는 is 1and Falseto 0및 비트 반전이 정수 1 및 의 비트 표현에 대해 작동 하기 때문 입니다 0.

따라서 이들은 "부정"하는 데 사용할 수 없습니다 bool.

NumPy 배열 (및 하위 클래스)을 사용한 부정

당신이 NumPy와 배열 처리 (또는 같은 서브 클래스가있는 경우 pandas.Series또는 pandas.DataFrame포함 부울을) 당신은 실제로 비트 역 연산자 (사용할 수있는 ~부정하는) 모든 배열의 논리 값을 :

>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False,  True, False,  True])

또는 동등한 NumPy 함수 :

>>> np.bitwise_not(arr)
array([False,  True, False,  True])

NumPy 배열에는 단일 (부울 배열이 아님)을 반환해야하기 때문에 not연산자 또는 operator.not함수를 사용할 수 bool없지만 NumPy에는 요소별로 작동하는 논리 not 함수도 포함되어 있습니다.

>>> np.logical_not(arr)
array([False,  True, False,  True])

부울이 아닌 배열에도 적용 할 수 있습니다.

>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False,  True])

자신 만의 클래스 커스터마이징

notbool값 을 호출 하여 작동 하고 결과를 부정합니다. 가장 간단한 경우 진리 값__bool__객체를 호출 합니다.

따라서 구현 __bool__(또는 __nonzero__Python 2)하여 진리 값을 사용자 정의 할 수 있으므로 다음과 같은 결과를 얻을 수 있습니다 not.

class Test(object):
    def __init__(self, value):
        self._value = value

    def __bool__(self):
        print('__bool__ called on {!r}'.format(self))
        return bool(self._value)

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return '{self.__class__.__name__}({self._value!r})'.format(self=self)

print실제로 메서드를 호출하는지 확인할 수 있도록 문을 추가했습니다 .

>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False

마찬가지로 가 적용될 __invert__때 동작을 구현하는 메서드를 구현할 수 있습니다 ~.

class Test(object):
    def __init__(self, value):
        self._value = value

    def __invert__(self):
        print('__invert__ called on {!r}'.format(self))
        return not self._value

    def __repr__(self):
        return '{self.__class__.__name__}({self._value!r})'.format(self=self)

다시 print호출하여 실제로 호출되는지 확인합니다.

>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False

>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True

그러나 __invert__그렇게 구현 하는 것은 동작이 "정상적인"Python 동작과 다르기 때문에 혼란 스러울 수 있습니다. 그렇게 한 적이 있다면 명확하게 문서화하고 꽤 좋은 (그리고 일반적인) 사용 사례가 있는지 확인하십시오.


11

파이썬에는 "not"연산자가 있습니다. 맞죠? 단지 "아닌"것이 아닙니까? 에서와 같이

  return not bool

2

부울 배열을 비교할 수 있습니다. 예를 들면

X = [True, False, True]

그때

Y = X == False

너에게 줄 것이다

Y = [False, True, False]

1
Numpy 배열의 경우 아마도 표준 Python 목록의 경우 이것은 올바르지 않습니다. OP도 언급하지 않았기 때문에 이것이 질문에 어떻게 대답하는지 알 수 없습니다.
SiHa

2

toggle 을 구현하려는 경우 영구 코드를 다시 실행할 때마다 무효화되도록 할 수 있습니다.

try:
    toggle = not toggle
except NameError:
    toggle = True

이 코드를 실행하면 먼저 설정됩니다 toggleTrue언제이라는 조각 인도 표준시는 토글 부정 될 것이다.


2

여기에서 허용되는 대답은 주어진 시나리오에 가장 정확합니다.

일반적으로 부울 값을 단순히 반전시키는 것에 대해 궁금해했습니다. 여기에서 허용되는 솔루션은 하나의 라이너로 작동하고 다른 하나의 라이너도 작동합니다. 부울이라는 것을 알고있는 변수 "n"이 있다고 가정하면이를 반전하는 가장 쉬운 방법은 다음과 같습니다.

n = n is False

내 원래 해결책이었고 다음 질문에서 받아 들여진 대답 :

n = not n

후자는 더 분명하다,하지만 성능에 대해 궁금 통해 hucked timeit- 그것은에서 밝혀 n = not n부울 값을 반전 할 수있는 빠른 방법도 있습니다.


n is False진실 테스트에 사용하지 마십시오 .
gerrit

0

동일한 결과를 얻는 또 다른 방법은 pandas 데이터 프레임에 유용하다는 것을 알았습니다.

mousetail에서 아래 제안 된대로 :

bool(1 - False)

bool(1 - True)

왜 안돼 bool(1 - False)?
mousetail

권리. 더 좋고 짧습니다.
Candide

numpy 배열과 같이 pandas 데이터 프레임의 논리적 반전이 없습니까?
gerrit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.