파이썬에서 두 변수 의 논리 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)
True
B
- Python logical
and
:A and B
: is를 반환A
하고 , 그렇지 않으면를 반환bool(A)
False
B
이러한 사고 방식을 대부분 유지하기 위해 나의 논리적 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
내가 쓴 영어가 미안하지만, 그것은 내가 태어난 언어가 아닙니다.
문안 인사.