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


648

파이썬에서 두 변수 의 논리 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'

3
몇 개의 문자열에 대해 "xor"를 어떻게 정의합니까? "abc"^ ""는 무엇을 반환하지 않아야한다고 생각합니까?
— Mehrdad Afshari 2016 년

18
일반 Python의 bool 유형으로 정의 된 문자열 중 하나만 True이므로 예외를 발생시키지 않고 True를 반환해야합니다.
— Zach Hirsch

38
파이썬에는 "xor"라는 삽입 연산자가 없다는 것이 놀랍습니다. 이는 가장 직관적 인 Pythonic 구현입니다. "^"를 사용하는 것은 다른 언어와 일치하지만 대부분의 Python만큼 읽기 쉽지 않습니다.
— Mark E. Haase

13
귀하의 질문에 @MehrdadAfshari 확실한 대답은 그가있다 a xor a로 정의 (a and not b) or (not a and b)때문에, 그리고 a xor b때, a그리고 b어떤 양보한다, 문자열, 또는 다른 어떤 종류 (a and not b) or (not a and b)수율을.
— Kaz

1
문제는 문서가 부족하다는 것입니다. ^는 "비트 배타적"또는 문자 그대로 해석되어 부울이 아닌 비트 단위를 의미합니다. 따라서 x'FFFF00 '^ x'FFFF00'은 x'000000 '이어야합니다. 아니면 이것은 문자 단위로 문자 단위로만 발생합니까? 숫자로 캐스팅? 더 긴 문자열의 길이와 일치하도록 더 짧은 문자열 문자를 반복해야합니다. 이 모든 것이 내장되어야합니다.
— mckenzm

답변:


1187

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

bool(a) != bool(b)

148
이것은 영리하고 짧지 만 깨끗하다고 ​​확신하지는 않습니다. 누군가 코드에서이 구문을 읽을 때 이것이 xor 연산이라는 것이 명백합니까? 나는 명확하지 않은 코드를 작성하고 주석으로 사과하려고한다는 신호 인 주석을 추가해야한다고 생각했습니다.

47
아마도 "XOR인지 확실합니까?" 잘못된 질문입니다. 우리는 두 질문에 대한 답이 같은지 확인하려고 노력했으며 XOR을 사용하여 구현할 것이라고 생각했습니다. 예를 들어, 사과를 오렌지와 비교하지 않으려면 "xor (isApple (x), isApple (y))" "가"if isApple (x)! = isApple (y) "보다 명확합니까? 나 한테는 안돼!
— AmigoNico

106
"! ="를 xor로 사용하는 데 문제가 있습니다. bool (a)! = bool (b)! = bool (c)는 bool (a) ^ bool (b) ^ bool (c)와 동일 할 것으로 예상됩니다. 따라서 캐스트를 부울하지만 ^을 권장합니다. 첫 번째 예에서 무슨 일이 일어나고 있는지 알기 위해 "오퍼레이터 체인"을 찾아보십시오.
— elmo

19
@elmo : 차이를 지적하는 데 +1, 운영자 체인이 무엇인지 가르쳐주는 +1! 나는 캠프에서! =를 ^만큼 읽을 수 없다고 말합니다.
— Mark E. Haase 3

13
bool(a) is not bool(b)대신 해야 합니까?
— RNA

485

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 에게 감사의 말을 전합니다 .


7
훌륭한 게시물이지만 매개 변수 이름을 지정하는 모든 방법 중에서 왜 'str1'과 'str2'입니까?
— SingleNegationElimination 16

1
@ 토큰 왜 안돼? 그것들은 파이썬 적이 지 않기 때문에 의미합니까?
— orokusaki

1
@Zach Hirsch 가독성을 위해 (b가 아니라 a) 대신 (a가 아닌 b)를 사용하거나 정의가 xor와 일치하지 않을 수 있습니다.
— orokusaki

10
(not b and a) or (not a and b)함수가 작동하는 pythonic 방식처럼 보이는 경우 문자열을 반환하도록 not을 먼저 배치해야 합니다.
— rjmunro 2016 년

2
@TokenMacGuy : 대신 이름을 지정해야한다고 제안한 것은 무엇입니까?
— user541686

180

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

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

3
이것이 내가 필요한 것입니다. 리버스 엔지니어링 맬웨어를 여러 번 수행하면 XOR 작업까지 문자열이 엉망이됩니다. 이 chr (xor (ord ( "n"), 0x1A)) = 't'사용
— ril3y

75
비트 단위이므로주의하십시오 : xor(1, 2)returns 3. docstring에서 : xor(a, b) -- Same as a ^ b. 가져온 모든 operator것은 기존의 내장 된 infix 연산자의 기능적 형식 이라는 것을 기억하십시오 .
— askewchan

5
@askewchan : bool형식이 __xor__부울을 반환하기 위해 오버로드 됩니다. 그것은 잘 작동하지만 bool(a) ^ bool(b)정확히 같은 일을 할 때 과잉 입니다.
— Martijn Pieters

@MartijnPieters ^운영자는 __xor__내부적으로 호출합니다 .
— Quantum7

5
@ Quantum7 : 예, 왜 당신이 나에게 이것을 말하고 있는지 잘 모르겠습니다. 방금 bool유형이 __xor__메소드를 호출하기 때문에^ 메소드를 구체적으로 구현 한다고 말했다 . 요점 bool(a) ^ bool(b)은 잘 작동하므로 operator.xor()여기 에서 기능 을 사용할 필요가 없습니다 .
— Martijn Pieters

43

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

xor = bool(a) ^ bool(b)

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

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

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

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

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

12
따라서 True + True + False + True == 3 및 3! = 1이지만 True XOR True XOR False XOR True == True입니다. "여러 피연산자에 XOR을 올바르게 구현"에 대해 자세히 설명 할 수 있습니까?
— tzot

3
@tzot ddaa의 솔루션에 따르면 한 번에 두 개의 변수에만 더하기를 적용하기 때문에 예제가 실패합니다. 따라서 모든 것을 작성하는 올바른 방법은되어야합니다 (((((True + True)==1)+False)==1)+True)==1. 여기에 주어진 대답은 여러 피연산자로 완전히 일반화됩니다.
— ely

6
또한 3 방향 XOR과 작업 순서 그룹화 된 2 개의 XOR 세트 간에는 차이가 있습니다. 따라서 3-WAY-XOR (A, B, C)는 XOR (XOR (A, B), C)와 같은 것이 아닙니다 . 그리고 ddaa의 예는 전자이고 후자는 가정합니다.
— ely

3
@ Mr.F 귀하의 설명이 실제로이 답변을 변명하지는 않습니다. 파이썬에서 방금 할 경우 True + True + False + True, 당신은 할 수 3, 그리고 True + True + False + True == 3다시 제공 True하면서 True + True + False + True == 1다시 제공합니다 False. 다시 말해, 여기에 대한 답변은 올바르게 일반화되지 않습니다. 그러기 위해서는 추가 작업이 필요합니다. 한편 간단한 True ^ True ^ False ^ True작업이 예상대로 작동합니다.
— jpmc26

3
@ jpmc26 귀하의 의견을 이해하지 못합니다. 더하기 접근 방식은 정확히 하나의 피연산자가 True다항 XOR 인지 확인하려는 작업을 일반화하는 것 입니다. 예를 들어와 다른 작업 A XOR B XOR ... XOR Z입니다. 다시 말해, 추가 기반 버전을 사용하려는 경우, 피연산자가 제출 True + True + False + True되면 결과가 False둘 이상이므로 True조건이 확인되면 작동합니다 == 1.
— 0:40에 ely

26
  • 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'

5
나에게는 나쁘거나 이상해 보인다. 다른 내장 논리 연산자는 가능한 세 가지 값 중 하나를 리턴하지 않습니다.
— Zach Hirsch

2
@Zach Hirsch : 이것이 " 사고의 대부분 을 유지하기 위해"라고 말한 이유입니다. 둘 다 참이든 거짓이든 좋은 결과는 없기 때문에
— nosklo

논리 연산은 논리 값을 리턴해야하므로 두 번째 "반환 a 또는 b"가 이상하게 보이므로 두 번째 리턴은 True를 리턴해야합니다.
— Denis Barmenkov

9
@Denis Barmenkov : 음, 음 파이썬 논리 연산자 그 and와 or논리 값을 반환하지 않습니다. 'foo' and 'bar'반환 'bar'...
— nosklo

6
첫눈에,이 개 이전 응답이 가장 좋아 보이지만, 두 번째 생각에,이 사실 만 진정으로 올바른 하나입니다, 그것은의 예를 제공하는 유일한 하나, 즉 xor내장과 일치 구현 and과 or. 그러나 물론, 실제 상황에서 bool(a) ^ bool(b)짝수 또는 a ^ b(경우 a와 b것으로 알려져있다 bool) 물론 더 간결하다.
— Erik Kaplun

23

몇 가지 접근 방식을 테스트했으며 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

6
그것은 내 인생의 100 ns입니다. 돌아 오지 않을 것입니다 ;-)
— Arel

4
중간 타이밍 from operator import truth의 경우 모듈 상단에서 수행 하고 테스트 할 수 있습니다 truth(a) != truth(b). bool는 C 수준 피할 많은 오버 헤드 (이것은 동등한로 인수를 수용해야 생성자있다 인 *args, **kwargs및 파싱 tuple하고 dict, 여기서이를 추출) truth최적 경로를 사용할 수있다 (기능 되) 요구하지 않는다는 중 하나 tuple또는 a dict, bool기반 솔루션 의 약 절반 시간 (하지만 여전히 not기반 솔루션 보다 더 긴 시간) 으로 실행됩니다 .
— ShadowRanger

9

보상 스레드 :

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

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

문안 인사.


또한 "엄격히 다른"것으로 읽는 데 사용합니다. 일부 언어는 이진 표현의 비트 단위로 연산을 구현하고 결과 비트 연산의 부울을 사용하기 때문입니다. 당신의 대답은 부울 공간 너머로 확장되기 때문에 더 "type-bulletproofed"이라고 생각합니다.
— yucer

나는 당신의 대답이 없음, 거짓을 비교하는 경우를 다루는 사실을 의미합니다. 예를 들어 : bool (False)! = bool ( '') 그럼에도 불구하고 False는 '' "이 아닙니다."엄격히 다르다 "라는 의미에 더 동의합니다
— yucer

8

파이썬에는 비트 배타적 OR 연산자가 있습니다 ^.

>>> True ^ False
True
>>> True ^ True
False
>>> False ^ True
True
>>> False ^ False
False

xor ( ^) 를 적용하기 전에 입력을 부울로 변환하여 사용할 수 있습니다 .

bool(a) ^ bool(b)

(편집-감사 Arel)


당신의 대답은 명확하게해야한다 ^A는 비트 XOR은 (질문은 질문처럼 논리적하지 XOR). bool(2) ^ bool(3)와 다른 답변을 제공합니다 bool(2 ^ 3).
— Arel

1
그렇지 않다 @Arel하지만. a ^ b다형입니다. 경우 a와 b있는 bool경우, 결과는 것 bool뿐만 아니라. 이 동작을 "비트 단위"xor라고 부를 수는 없습니다.
— Alfe

@ 중요한 점은 값을 먼저 부울로 캐스트해야한다는 것입니다. 파이썬 문서를 정의 ^는 유형이 보존되는 흥미로운 점에도 불구하고 비트와 같은, bool그리고 int유형. 참고 : True ^ 2은 3실제로 비트 방식을 보여줍니다.
— Arel

@Arel 예, bool ^ int모든 것을 int먼저 캐스팅하는 것 입니다. 또, 파이썬 내장 한 ^오퍼레이터에 대해 많은 비트 int와 하나가 표현 비트 bool모두 그래서, 비트 있지만 비트 단일 비트는 XOR 이다 논리적 부울위한 XOR.
— Alfe

xor공학적 배경에서 비롯된 것을 이해하면서도이 연산자를 사용하는 것을 싫어 합니다. 이것은 본능적으로 수학적 힘처럼 느껴집니다. 즉, 2^3 = pow(2,3)혼란을 방지하기 위해 항상 명시 적으로 주석을 달아야합니다.
— Nicholas Hamilton

8

변수 인수를 사용하는 xor의 간단한 변형을 보지 않고 진실 값 True 또는 False에 대해서만 작업을 수행하므로 누구나 사용할 수 있도록 여기에 버릴 것입니다. 다른 사람들이 지적한 바와 같이, 매우 간단합니다.

def xor(*vars):
    sum = False
    for v in vars:
        sum = sum ^ bool(v)
    return sum

사용법도 간단합니다.

if xor(False, False, True, False):
    print "Hello World!"

이것은 일반화 된 이진 논리 XOR이므로, 참 피연산자의 수가 홀수 일 때마다 참 값이 참이됩니다 (정확히 하나가 참일 때뿐만 아니라, 이진 XOR이 참인 경우에 한합니다).

따라서 정확히 하나의 피연산자 중 하나 일 때만 참인 n-ary 술어를 검색하는 경우 다음을 사용할 수 있습니다.

def isOne(*vars):
    sum = False
    for v in vars:
        if sum and v:
            return False
        else:
            sum = sum or v
    return sum

이 답변을 개선하기 위해 : (bool(False) is False) == True. 당신은 False그 라인에서 사용할 수 있습니다 .
— pathunstrom

7

독점 또는 다음과 같이 정의됩니다

def xor( a, b ):
    return (a or b) and not (a and b)

2
xor ( 'this', '')에 대해 True를 반환하고 파이썬의 방식을 따르려면 'this'를 반환해야합니다.
— nosklo

@nosklo : BDFL과 함께하십시오. 파이썬이 True를 반환하기 때문에 파이썬 의 방식 이어야합니다 .
— S.Lott

2
다른 파이썬 논리 연산자와의 일관성을 의미합니다. 파이썬은 내가 할 때 True를 반환하지 않으며 ( 'this'또는 '') 'this'를 반환합니다. 그러나 함수에서 xor ( 'this', '')는 True를 반환합니다. 파이썬 내장 함수처럼 'this'를 반환해야합니다.
— nosklo

10
파이썬 and과 or합선. 모든 xor단락, 그래서 이미 차이가 있습니다 구현; 따라서 + xor처럼 작동해야 할 이유가 없습니다 . andor
— tzot

7

때로는 부울 True 및 False 값 대신 1과 0으로 작업하는 경우가 있습니다. 이 경우 xor는 다음과 같이 정의 할 수 있습니다.

z = (x + y) % 2

다음과 같은 진리표가 있습니다.

     x
   |0|1|
  -+-+-+
  0|0|1|
y -+-+-+
  1|1|0|
  -+-+-+

7

나는 이것이 늦었다는 것을 알고 있지만, 나는 생각을 가지고 있었고 문서화를 위해 가치가있을 수 있습니다. 아마도 이것이 효과가있을 것입니다 : np.abs(x-y)아이디어는

  1. x = True = 1이고 y = False = 0이면 결과는 | 1-0 | = 1 = True입니다.
  2. x = False = 0이고 y = False = 0이면 결과는 | 0-0 | = 0 = False입니다.
  3. x = True = 1이고 y = True = 1이면 결과는 | 1-1 | = 0 = False입니다.
  4. x = False = 0이고 y = True = 1이면 결과는 | 0-1 | = 1 = True입니다.

7

간단하고 이해하기 쉬운 :

sum( (bool(a), bool(b) ) == 1

독점적 인 선택이 당신이 추구하는 것이라면 여러 가지 인수로 확장 될 수 있습니다.

sum( bool(x) for x in y ) % 2 == 1

1
sum(map(bool, y)) % 2 == 1
— warvariuc

6

이건 어때요?

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

줄 것이다 a경우 b거짓 인
줄 것이다 b경우 a거짓 인
줄 것이다 False, 그렇지 않으면

또는 Python 2.5+ 삼항 표현식을 사용하십시오.

(False if a else b) if b else a

6

여기에 제안 된 구현 중 일부는 피연산자를 반복적으로 평가하여 의도하지 않은 부작용으로 이어질 수 있으므로 피해야합니다.

그건 말했다 xor반환하거나 것을 구현 True하거나 False매우 간단하다; 피연산자 중 하나를 반환하는 피연산자는 가능한 경우 훨씬 까다 롭습니다. 특히 피연산자가 둘 이상인 경우 어떤 피연산자를 선택해야하는지에 대한 합의가 없기 때문입니다. 예를 들어,해야 xor(None, -1, [], True)반환 None, []또는 False? 각 답변은 일부 사람들에게 가장 직관적 인 답변으로 보입니다.

True- 또는 False-result의 경우 가능한 5 가지 선택 사항이 있습니다. 첫 번째 피연산자 리턴 (값이 최종 결과와 일치하는 경우 부울 임), 첫 번째 일치 리턴 (최소 하나가 존재하는 경우 부울) 마지막 피연산자 반환 (if ... else ...), 마지막 일치 반환 (if ... else ...) 또는 항상 부울 반환 모두 5 ** 2 = 25 맛입니다 xor.

def xor(*operands, falsechoice = -2, truechoice = -2):
  """A single-evaluation, multi-operand, full-choice xor implementation
  falsechoice, truechoice: 0 = always bool, +/-1 = first/last operand, +/-2 = first/last match"""
  if not operands:
    raise TypeError('at least one operand expected')
  choices = [falsechoice, truechoice]
  matches = {}
  result = False
  first = True
  value = choice = None
  # avoid using index or slice since operands may be an infinite iterator
  for operand in operands:
    # evaluate each operand once only so as to avoid unintended side effects
    value = bool(operand)
    # the actual xor operation
    result ^= value
    # choice for the current operand, which may or may not match end result
    choice = choices[value]
    # if choice is last match;
    # or last operand and the current operand, in case it is last, matches result;
    # or first operand and the current operand is indeed first;
    # or first match and there hasn't been a match so far
    if choice < -1 or (choice == -1 and value == result) or (choice == 1 and first) or (choice > 1 and value not in matches):
      # store the current operand
      matches[value] = operand
    # next operand will no longer be first
    first = False
  # if choice for result is last operand, but they mismatch
  if (choices[result] == -1) and (result != value):
    return result
  else:
    # return the stored matching operand, if existing, else result as bool
    return matches.get(result, result)

testcases = [
  (-1, None, True, {None: None}, [], 'a'),
  (None, -1, {None: None}, 'a', []),
  (None, -1, True, {None: None}, 'a', []),
  (-1, None, {None: None}, [], 'a')]
choices = {-2: 'last match', -1: 'last operand', 0: 'always bool', 1: 'first operand', 2: 'first match'}
for c in testcases:
  print(c)
  for f in sorted(choices.keys()):
    for t in sorted(choices.keys()):
      x = xor(*c, falsechoice = f, truechoice = t)
      print('f: %d (%s)\tt: %d (%s)\tx: %s' % (f, choices[f], t, choices[t], x))
  print()

5

나 자신을 포함한 많은 사람들 xor은 n 입력 변수 인 n 입력 xor 회로처럼 동작 하는 기능이 필요하다 . https://en.wikipedia.org/wiki/XOR_gate를 참조 하십시오 . 다음과 같은 간단한 함수가이를 구현합니다.

def xor(*args):
   """
   This function accepts an arbitrary number of input arguments, returning True
   if and only if bool() evaluates to True for an odd number of the input arguments.
   """

   return bool(sum(map(bool,args)) % 2)

샘플 I / O는 다음과 같습니다.

In [1]: xor(False, True)
Out[1]: True

In [2]: xor(True, True)
Out[2]: False

In [3]: xor(True, True, True)
Out[3]: True

5

파이썬에서 두 개 이상의 변수의 논리 xor를 얻으려면 :

  1. 입력을 부울로 변환
  2. 비트 xor 연산자 ( ^또는 operator.xor)를 사용하십시오.

예를 들어

bool(a) ^ bool(b)

입력을 부울로 변환하면 비트 xor가 논리 xor가됩니다.

허용되는 답변이 잘못되었다는 점에 유의하십시오 . 연산자 체인!= 의 미묘함으로 인해 Python의 xor와 동일하지 않습니다 .

예를 들어, 다음 세 가지 값 중 xor는 사용할 때 잘못되었습니다 !=.

True ^  False ^  False  # True, as expected of XOR
True != False != False  # False! Equivalent to `(True != False) and (False != False)`

(PS는이 경고를 포함하도록 허용 된 답변을 편집하려고 시도했지만 변경 사항이 거부되었습니다.)


4

XOR의 기능을 알면 쉽습니다.

def logical_xor(a, b):
    return (a and not b) or (not a and b)

test_data = [
  [False, False],
  [False, True],
  [True, False],
  [True, True],
]

for a, b in test_data:
    print '%r xor %s = %r' % (a, b, logical_xor(a, b))

4

이것은 두 개 이상의 변수에 대한 논리적 배타적 XOR을 얻습니다.

str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")

any([str1, str2]) and not all([str1, str2])

이 설정의 첫 번째 문제는 전체 목록을 두 번 통과하고 최소한 하나 이상의 요소를 두 번 확인한다는 것입니다. 따라서 코드 이해력을 높일 수는 있지만 속도에 적합하지 않습니다 (사용 사례에 따라 무시할 수 있음).

이 설정의 두 번째 문제점은 변수 수에 관계없이 독점 성을 검사한다는 것입니다. 이것은 처음에는 기능으로 간주 될 수 있지만 변수의 수가 증가함에 따라 첫 번째 문제는 훨씬 더 중요해집니다.


4

Xor는 ^Python입니다. 다음을 반환합니다.

  • 정수를위한 비트 xor
  • 부울의 논리 xor
  • 세트를위한 독점 조합
  • 를 구현하는 클래스에 대한 사용자 정의 결과 __xor__.
  • 문자열 또는 사전과 같은 정의되지 않은 유형의 경우 TypeError

어쨌든 문자열에 문자열을 사용하려는 경우 캐스팅 bool하면 작업이 모호하지 않습니다 (의미 할 수도 있음 set(str1) ^ set(str2)).



3

이것이 내가 진실 테이블을 코딩하는 방법입니다. 특히 xor의 경우 :

| a | b  | xor   |             |
|---|----|-------|-------------|
| T | T  | F     |             |
| T | F  | T     | a and not b |
| F | T  | T     | not a and b |
| F | F  | F     |             |

응답 열의 T 값을보고 논리 또는를 사용하여 모든 실제 사례를 함께 문자열 화하십시오. 따라서이 진리표는 사례 2 또는 3에서 생성 될 수 있습니다.

xor = lambda a, b: (a and not b) or (not a and b)

-6

다음을 사용하여 두 변수의 xor를 쉽게 찾을 수 있습니다.

def xor(a,b):
    return a !=b

예:

xor (참, 거짓) >>> 참


1
또는 xor("hey", "there")>>> 맞다, 그러나 그것은 우리가 원하는 것이 아니다
— Mayou36
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.