[python] ((x == a and y == b) 또는 (x == b and y == a))를 표현하는 더 우아한 방법이 있습니까?

((x == a and y == b) or (x == b and y == a))파이썬 으로 평가하려고 하는데 조금 장황한 것 같습니다. 더 우아한 방법이 있습니까?



답변

요소가 해시 가능하면 세트를 사용할 수 있습니다.

{a, b} == {y, x}


답변

나는 당신이 얻을 수있는 최선의 방법은 튜플로 패키지하는 것입니다.

if (a, b) == (x, y) or (a, b) == (y, x)

또는 세트 조회에서 랩핑 할 수도 있습니다.

if (a, b) in {(x, y), (y, x)}

몇 가지 의견으로 언급되었으므로 타이밍을 조정했으며 조회가 실패하면 튜플과 세트가 동일한 방식으로 수행되는 것처럼 보입니다.

from timeit import timeit

x = 1
y = 2
a = 3
b = 4

>>> timeit(lambda: (a, b) in {(x, y), (y, x)}, number=int(5e7))
32.8357742

>>> timeit(lambda: (a, b) in ((x, y), (y, x)), number=int(5e7))
31.6169182

조회가 성공하면 실제로 튜플이 더 빠르지 만

x = 1
y = 2
a = 1
b = 2

>>> timeit(lambda: (a, b) in {(x, y), (y, x)}, number=int(5e7))
35.6219458

>>> timeit(lambda: (a, b) in ((x, y), (y, x)), number=int(5e7))
27.753138700000008

멤버십 조회를 수행하고 있기 때문에 세트를 사용하기로 선택했으며 개념적으로 세트는 튜플보다 해당 사용 사례에 더 적합합니다. 특정 사용 사례에서 두 구조간에 유의 한 차이를 측정 한 경우 더 빠른 구조로 진행하십시오. 나는 여기서 성능이 요소라고 생각하지 않습니다.


답변

튜플은 약간 더 읽기 쉽습니다.

(x, y) == (a, b) or (x, y) == (b, a)

이것은 힌트를줍니다 : 우리는 시퀀스 x, y가 시퀀스 와 같은지 검사 a, b하지만 순서 는 무시합니다. 그것은 단지 평등을 설정 한 것입니다!

{x, y} == {a, b}


답변

항목을 해시 할 수 없지만 주문 비교를 지원하는 경우 다음을 시도해 볼 수 있습니다.

sorted((x, y)) == sorted((a, b))


답변

내 생각에 가장 우아한 방법은

(x, y) in ((a, b), (b, a))

{a, b} == {y, x}변수를 해시 할 수 있는지 생각할 필요가 없으므로 다른 답변에 표시된 것처럼 집합을 사용하는 것보다 낫습니다.


답변

이것들이 숫자라면을 사용할 수 있습니다 (x+y)==(a+b) and (x*y)==(a*b).

이것들이 비슷한 아이템이라면을 사용할 수 있습니다 min(x,y)==min(a,b) and max(x,y)==max(a,b).

그러나 ((x == a and y == b) or (x == b and y == a))명확하고 안전하며 더 일반적입니다.


답변

둘 이상의 변수에 대한 일반화로 사용할 수 있습니다 itertools.permutations. 그 대신에

(x == a and y == b and z == c) or (x == a and y == c and z == b) or ...

우리는 쓸 수있다

(x, y, z) in itertools.permutations([a, b, c])

그리고 물론 두 가지 변수 버전 :

(x, y) in itertools.permutations([a, b])