2015-02-06 2 views
1

저는 파이썬으로 초보자입니다. 나는해야 할 일련의 지시들에 막혔습니다. 3 정수의 두 튜플을 매개 변수로 사용하는 함수를 만들어야합니다. 이 함수는 2 개의 첫 번째 정수, 두 번째의 정수 및 두 번째의 정수 사이에서 xor를 수행합니다. 마지막으로이 결과를 터플로 반환합니다.Xor 튜플 함수

여기에 내가 코드에서 이전에 사용하는 기능입니다 :

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

그 정확성이나 명백히 거짓이 아니라면, 알려 주시기 바랍니다. 감사!

+0

무엇이 문제입니까? 어떤 입력 값이 잘못된 결과를 산출합니까? – AlG

+0

나는 그것이 올바른 가치를 부여하는지 여부를 확인할 수 있다고 생각한다. –

+0

비트 XOR 또는 부울 XOR? –

답변

1

ab는 같은 크기의 정수 튜플이 있다고 가정 (당신이 주장 할 필요) :

파이썬에서
def xor(a, b): 
    return tuple(a[i]^v for i, v in enumerate(b)) 
+0

이것은 생성자를 반환한다. 당신은'tuple (a [i]^v for i, v를 열거한다 (b))' –

+0

@SebastianStigler, 고쳐 주셔서 고맙습니다. – Selcuk

5

^ 중위 연산자는 정수에 대한 XOR를 나타냅니다 (당신이보고이를 볼 수 있습니다 int.__xor__에 대한 설명서가 있지만 에주의해야합니다.의 경우 __xor__ 동작이 다른 유형에 과부하 될 수 있으며 일반적인 논리 xor 연산과 관련된 내용이 반영되지 않을 수 있습니다.

이 경우에, 당신은 그것을 좋아 할 수 있습니다 : 예를 들어

def xor(tup_a, tup_b): 
    return tuple(a^b for a,b in zip(tup_a, tup_b)) 

:

In [5]: xor((1,2,3), (3, 2, 1)) 
Out[5]: (2, 0, 2) 

이 익숙하지 않은 경우에 대한 읽어야되는 zip 기능을 사용한다. 이 함수에 대한 하나의 규칙 : tup_atup_b의 길이가 같지 않으면 지퍼 링 프로세스가 더 짧은 길이까지만 발생하며 긴 지오메트리의 나머지 항목은 무시됩니다.

여분의 항목을 처리하기 위해 특별한 작업을 수행하기 위해 특별한 코드를 작성하려면 itertools.izip_longest을 사용하도록이 함수 정의를 수정해야합니다. 예를 들어

, ... tup_a 다음보다 짧은 tup_b 인 경우 tup_atup_b에서 무언가와 일치 긴 것만으로는 충분하지 않습니다 어디 장소에서 0의 더미 값을 사용한다고 가정

from itertools import izip_longest 
def xor(tup_a, tup_b, fill=0): 
    return tuple(a^b for a,b in izip_longest(tup_a, tup_b, fillvalue=fill)) 

다음 :

In [11]: xor((1,2,3), (3, 2, 1)) 
Out[11]: (2, 0, 2) 

In [12]: xor((1,2), (3, 2, 1)) 
Out[12]: (2, 0, 1) 
+0

그게 정확히 내가 필요로 한 것입니다! –

+0

.zip 함수의 역할을 찾고있었습니다. 감사합니다. –

+0

같은 크기의 두 튜플로 작업하고 있으므로 필요 없다.하지만 나중에 필요하게 될 것이다. 따라서 zip 함수는 더 긴 튜플의 항목을 잘라 내고, 우리가 버려진 항목을 수정하고 싶다면, itertools.izip_longest를 사용할 것입니다. (빈 itemps를 0으로 채우는 것과 같습니다.) –