[python] 파이썬에서 두 변수의 논리 xor를 어떻게 얻습니까?

파이썬에서 두 변수 의 논리 xor 를 어떻게 얻 습니까?

예를 들어 문자열이 될 것으로 예상되는 두 가지 변수가 있습니다. 그중 하나만 True 값을 포함하는지 테스트하고 싶습니다 (없음 또는 빈 문자열이 아님).

str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")
if logical_xor(str1, str2):
    print "ok"
else:
    print "bad"

^연산자는 비트 것 같다, 모든 개체에 대해 정의되지 :

>>> 1 ^ 1
0
>>> 2 ^ 1
3
>>> "abc" ^ ""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for ^: 'str' and 'str'



답변

입력을 이미 부울로 정규화하는 경우! =는 xor입니다.

bool(a) != bool(b)


답변

xor의 정의를 항상 사용하여 다른 논리 연산에서 계산할 수 있습니다.

(a and not b) or (not a and b)

그러나 이것은 나에게 너무 장황하며 언뜻보기에는 명확하지 않습니다. 다른 방법은 다음과 같습니다.

bool(a) ^ bool(b)

두 부울의 xor 연산자는 논리 xor입니다 (비트 단위의 int와 달리). bool의 하위 클래스int 이기 때문에 의미 있지만 0및 값만 갖도록 구현됩니다 1. 그리고 논리 xor는 도메인이 0및 로 제한 될 때 비트 xor 와 같습니다 1.

따라서 logical_xor기능은 다음과 같이 구현됩니다.

def logical_xor(str1, str2):
    return bool(str1) ^ bool(str2)

Python-3000 메일 링리스트 에서 Nick Coghlan 에게 감사의 말을 전합니다 .


답변

비트 배타적-또는 이미 operator모듈 에 파이썬에 내장되어 있습니다 ( ^연산자와 동일합니다 ).

from operator import xor
xor(bool(a), bool(b))  # Note: converting to bools is essential


답변

자크는 설명했다, 당신은 사용할 수 있습니다 :

xor = bool(a) ^ bool(b)

개인적으로 나는 약간 다른 방언을 선호합니다.

xor = bool(a) + bool(b) == 1

이 방언은 학교에서 배운 논리적 다이어그램 언어에서 영감을 얻었습니다. 여기서 “OR”은 ≥1(1 이상)을 포함하는 상자로 표시되고 “XOR”은를 포함하는 상자로 표시됩니다 =1.

이는 배타적이거나 여러 피연산자를 올바르게 구현할 수 있다는 이점이 있습니다.

  • “1 = a ^ b ^ c …”는 실제 피연산자의 수가 홀수임을 나타냅니다. 이 연산자는 “패리티”입니다.
  • “1 = a + b + c …”는 정확히 하나의 피연산자가 참임을 의미합니다. 이것은 “배타적”또는 “다른 것의 배제”를 의미합니다.

답변

  • Python logical or: A or B: is를 반환 A하고 , 그렇지 않으면를 반환bool(A)TrueB
  • Python logical and: A and B: is를 반환 A하고 , 그렇지 않으면를 반환bool(A)FalseB

이러한 사고 방식을 대부분 유지하기 위해 나의 논리적 xor 정의는 :

def logical_xor(a, b):
    if bool(a) == bool(b):
        return False
    else:
        return a or b

그 방법은 그것을 반환 할 수 있습니다 a, b또는 False:

>>> logical_xor('this', 'that')
False
>>> logical_xor('', '')
False
>>> logical_xor('this', '')
'this'
>>> logical_xor('', 'that')
'that'


답변

몇 가지 접근 방식을 테스트했으며 not a != (not b)가장 빠른 것으로 나타났습니다.

다음은 몇 가지 테스트입니다

%timeit not a != (not b)
10000000 loops, best of 3: 78.5 ns per loop

%timeit bool(a) != bool(b)
1000000 loops, best of 3: 343 ns per loop

%timeit not a ^ (not b)
10000000 loops, best of 3: 131 ns per loop

편집 : 위의
예제 1과 3에 괄호가 없으므로 결과가 올바르지 않습니다. truth()ShadowRanger가 제안한 새로운 결과 + 기능.

%timeit  (not a) ^  (not b)   # 47 ns
%timeit  (not a) != (not b)   # 44.7 ns
%timeit truth(a) != truth(b)  # 116 ns
%timeit  bool(a) != bool(b)   # 190 ns


답변

보상 스레드 :

Anoder idea … 논리적 인«xor»의 행동을 얻기 위해 피 토닉 표현«이 아닌»을 시도해보십시오.

진리표는 다음과 같습니다.

>>> True is not True
False
>>> True is not False
True
>>> False is not True
True
>>> False is not False
False
>>>

그리고 예제 문자열의 경우 :

>>> "abc" is not  ""
True
>>> 'abc' is not 'abc'
False
>>> 'abc' is not ''
True
>>> '' is not 'abc'
True
>>> '' is not ''
False
>>> 

하나; 위에 표시된 것처럼 문자열은 boleans가 아니기 때문에 커플 문자열에 대해 꺼내려는 실제 동작에 따라 다릅니다. and “및”or “»
http://www.diveintopython.net/power_of_introspection/and_or.html

내가 쓴 영어가 미안하지만, 그것은 내가 태어난 언어가 아닙니다.

문안 인사.