파이썬에서 두 변수의 논리 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 : 음, 음 파이썬 논리 연산자 그 andor논리 값을 반환하지 않습니다. 'foo' and 'bar'반환 'bar'...
nosklo

6
첫눈에,이 개 이전 응답이 가장 좋아 보이지만, 두 번째 생각에,이 사실 만 진정으로 올바른 하나입니다, 그것은의 예를 제공하는 유일한 하나, 즉 xor내장과 일치 구현 andor. 그러나 물론, 실제 상황에서 bool(a) ^ bool(b)짝수 또는 a ^ b(경우 ab것으로 알려져있다 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다형입니다. 경우 ab있는 bool경우, 결과는 것 bool뿐만 아니라. 이 동작을 "비트 단위"xor라고 부를 수는 없습니다.
Alfe

@ 중요한 점은 값을 먼저 부울로 캐스트해야한다는 것입니다. 파이썬 문서를 정의 ^는 유형이 보존되는 흥미로운 점에도 불구하고 비트와 같은, bool그리고 int유형. 참고 : True ^ 23실제로 비트 방식을 보여줍니다.
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
파이썬 andor합선. 모든 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.