HOWTO · Python

Python 튜플을 비교하는 방법

이 종합 가이드를 통해 Python에서 튜플을 효과적으로 비교하는 방법을 알아보세요. 동등성 검사, 부등성 검사, 사전식 비교 등 다양한 방법을 살펴봅니다. 내장 함수를 사용한 요소별 비교 방법도 알아봅니다. 초보자이든 숙련된 프로그래머이든, 실용적인 예제와 명확한 설명으로 코딩 실력을 향상시킬 수 있습니다.

이 페이지의 내용

Python으로 작업하다 보면 튜플을 비교해야 할 경우가 자주 있습니다. 튜플은 변경할 수 없는 시퀀스, 즉 한 번 생성되면 수정할 수 없습니다. 이러한 특성 덕분에 튜플은 고정된 항목 모음을 저장하는 데 특히 유용합니다. 튜플을 비교하면 동등성, 순서, 심지어 내용까지 판단할 수 있습니다.

이 기사에서는 단순한 동등성 검사부터 사전식 순서까지 Python이 튜플을 비교하는 방식과, 튜플의 타입, 길이, 중첩이 다를 때 비교가 어떻게 동작하는지 살펴보겠습니다.

Python이 튜플을 비교하는 방식

Python은 튜플을 사전식으로 비교하는데, 이는 단어가 사전에 배열되는 방식과 같습니다. 각 튜플의 첫 번째 요소를 비교합니다. 그 요소들이 다르면 그 첫 번째 차이가 비교를 결정하고, 나머지 요소는 전혀 보지 않습니다. 첫 번째 요소가 같으면 다음 쌍으로 넘어가는 식으로, 차이가 발견되거나 요소가 소진될 때까지 계속합니다. 한 튜플이 다른 튜플의 접두사인 경우, 즉 그 모든 요소가 더 긴 튜플의 시작 부분과 일치하는 경우, 더 짧은 튜플이 더 긴 튜플보다 작은 것으로 간주됩니다.

동등 연산자(==)는 두 튜플이 같은 순서로 같은 요소를 가지고 있는지 검사하고, 부등 연산자(!=)는 그 정확한 반대입니다.

tuple1 = (1, 2, 3)
tuple2 = (1, 2, 3)
tuple3 = (1, 2, 4)

print(tuple1 == tuple2)
print(tuple1 == tuple3)
print(tuple1 != tuple3)

출력:

True
False
True

순서 연산자(<, <=, >, >=)는 동일한 요소별 스캔을 적용하며, 각 쌍 자체의 순서를 사용하여 결정합니다.

tuple1 = (1, 2, 3)
tuple2 = (1, 2, 4)
tuple3 = (1, 2)

print(tuple1 < tuple2)
print(tuple1 > tuple3)

출력:

True
True

여기서 tuple1이 tuple2보다 작은 이유는 처음 두 요소가 같고 3 < 4이기 때문입니다. 그리고 tuple1이 tuple3보다 큰 이유는 tuple3이 tuple1의 접두사이므로 더 긴 튜플이 더 짧은 튜플 뒤에 순서가 정해지기 때문입니다.

다양한 타입, 길이, 중첩 튜플 다루기

동등성과 순서는 혼합 타입을 같은 방식으로 취급하지 않으며, 이 둘을 혼동하는 것이 잘못된 기대의 흔한 원인입니다.

동등성은 타입 때문에 오류를 일으키는 일이 결코 없습니다. 타입이 다른 두 요소는 단순히 동등하지 않습니다. 단, 1과 1.0 같은 값이 동등하다고 여겨지는 일반적인 숫자 예외는 있습니다. 따라서 ==를 사용한 튜플 비교는 False를 반환하고, !=는 True를 반환합니다. 누군가 먼저 타입을 검사하는 것이 아닙니다.

tuple1 = (1, "a", 3)
tuple2 = (1, 2, 3)

print(tuple1 == tuple2)
print(tuple1 != tuple2)

출력:

False
True

순서는 더 엄격합니다. 순서 비교가 문자열과 정수처럼 서로 순서를 정할 수 없는 요소 쌍에 도달하는 순간, 결과를 반환하는 대신 TypeError를 발생시킵니다.

tuple1 = (1, "a", 3)
tuple2 = (1, 2, 3)

print(tuple1 < tuple2)

출력:

TypeError: '<' not supported between instances of 'str' and 'int'

첫 번째 요소가 같으므로 비교는 "a" 대 2로 넘어갑니다. 그리고 문자열과 정수 사이에는 순서가 없으므로 오류가 발생합니다. 이는 비교가 실제로 일치하지 않는 쌍에 도달할 때만 발생한다는 점에 유의하세요. (0, "a") < (1, 2)는 첫 번째 요소가 이미 결정하기 때문에 오류 없이 False를 반환합니다.

길이가 다르면 널리 사용되는 요소별 동등성 검사와 놓치기 쉬운 방식으로 상호 작용합니다. all()과 zip()을 결합하면 zip()이 생성하는 쌍을 비교하는데, zip()은 더 짧은 튜플에서 멈춥니다. 따라서 짝이 없는 말미 요소는 조용히 무시됩니다.

tuple1 = (1, 2, 3)
tuple2 = (1, 2)

print(all(a == b for a, b in zip(tuple1, tuple2)))
print(len(tuple1) == len(tuple2) and all(a == b for a, b in zip(tuple1, tuple2)))

출력:

True
False

첫 번째 줄은 말미의 3이 전혀 비교되지 않기 때문에 튜플이 동등하지 않은데도 True를 보고합니다. 이 패턴을 사용한다면(큰 튜플이나 요소별 맞춤 로직에 유용합니다), 두 번째 줄처럼 항상 길이 검사와 함께 사용하세요.

중첩 튜플은 특별한 처리가 필요 없습니다. 튜플 요소는 다른 요소와 동일한 규칙으로 재귀적으로 비교됩니다. 한 튜플 안의 (1, 2)는 다른 튜플 안의 (3, 5)보다 앞에 순서가 정해집니다. 그 자체의 첫 번째로 다른 요소가 이를 결정하기 때문입니다.

tuple1 = ((1, 2), (3, 4))
tuple2 = ((1, 2), (3, 5))

print(tuple1 < tuple2)
print(tuple1 == tuple2)

출력:

True
False

요약하면, 두 튜플이 같은지 알기만 하면 되는 경우에는 ==와 !=를 사용하세요. 어떤 내용에서도 동작합니다. 상대적 순서가 필요한 경우 순서 연산자를 사용하고, 비교가 실제로 도달할 요소들이 서로 순서를 정할 수 있는지 확인하세요.