파이썬 초보 질문. aa != bb != cc != dd 라고 하면 작동이 안되는 이유가 뭔가요?
조회수 533회
while True:
aa=random.randint(1,10)
bb=random.randint(1,10)
cc=random.randint(1,10)
dd=random.randint(1,10)
if aa != bb != cc != dd:
break
여기에서
if aa!=bb and bb!=cc and aa!=cc and aa!=dd and bb!=dd and cc!=dd:
라고 하면 작동이 되는데
if aa != bb != cc != dd:
라고 하면 작동이 안되는 이유가 뭔가요?
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
3 답변
-
이유라고 한다면 파이썬에서 허용하지 않는 문법이기 때문입니다.
아래와 같은 형태로 사용할 순 있습니다.
if all([aa != bb, bb != cc, cc != dd]):
-
약간의 보충 설명을 해 보자면,
파이썬의 연산자와 연산자의 우선순위 같은 건 다 아시리라 믿겠습니다.
마찬가지로 아시겠지만
!=
은 비교 연산자 중 하나로, 두 값이 서로 다르다는 것을 의미합니다.aa != bb != cc != dd
위에서는 동일한 비교 연산자를 세 개 사용했으니 우선순위는 모두 동일합니다. 그러면 결국
((aa != bb) != cc) != dd
와 같다고 할 수 있겠네요편의상
aa = 1, bb= 2
라고 해 보겠습니다.그러면
aa != bb
는True
가 되겠네요다시 말해
(True != cc) != dd
가 되는겁니다.cc는 숫자이니 boolean값과
!=
연산자로 비교하면 무조건True
가 될 테고,True != dd
도 마찬가지입니다.올려주신 예시로 보아 각각의 숫자가 모두 다른지를 확인하려고 하신 것 같은데,
위의 식으로 돌리면 무조건 True가 나오기 때문에 의도했던 것과는 다른 결과가 나오게 되는겁니다.
-
모든 쌍의 조합에 대해 비교연산을 해야 하는데, 이게 원소가 많으면 번거롭고, 빠뜨리게 됩니다.
itertools.combinations 와 all 을 이용할 수도 있는데,
set 으로 중복을 제거해서 갯수를 비교하면 빠뜨릴 염려는 없습니다.
>>> s = [ 1,2,3,4,5 ] >>> len(s) == len(set(s)) True >>> s = [ 1,2,3,4,1 ] >>> len(s) == len(set(s)) False
댓글 입력