((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])