Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 cmp() 함수란? 두 값과 리스트를 비교하는 방법 완벽 정리

cmp() 함수란?

파이썬의 cmp(x, y) 함수는 두 인수 x와 y의 값을 서로 비교하는 내장 함수입니다.

cmp(x, y)

반환값은 다음과 같습니다.

  • x가 y보다 작으면 음수
  • x와 y가 같으면 0
  • x가 y보다 크면 양수

내장 cmp() 함수는 일반적으로 -1, 0, 1 중 하나만 반환합니다. 하지만 동일한 호출 방식을 사용하는 다른 함수들은 이외의 값을 반환할 수도 있으므로, 결과값 자체보다는 결과의 부호(양수/음수/0)만 확인하는 것이 안전합니다.

기본 사용 예제

>>> cmp(2, 8)
-1
>>> cmp(6, 6)
0
>>> cmp(4, 1)
1
>>> cmp('stackexchange', 'stackoverflow')
-1

리스트 비교를 위한 cmp()

cmp() 메서드는 두 리스트의 요소들을 순서대로 비교할 때도 사용됩니다.

구문

cmp(list1, list2)

비교 규칙

리스트 비교는 다음 규칙에 따라 진행됩니다.

  • 요소들이 같은 타입이면 해당 타입의 비교를 수행하고 결과를 반환합니다.
  • 요소들의 타입이 다르면 먼저 숫자인지 확인합니다.
  • 둘 다 숫자라면 필요한 경우 숫자 형변환(numeric coercion)을 거친 뒤 수치 비교를 수행합니다.
  • 한쪽 요소만 숫자라면 숫자가 아닌 쪽이 "더 큰" 것으로 간주됩니다. 즉, 숫자는 모든 타입 중 "가장 작은" 것으로 취급됩니다.
  • 위 경우에 해당하지 않으면 타입 이름을 알파벳 순으로 정렬하여 비교합니다.

한쪽 리스트의 끝에 도달했다면 더 긴 리스트가 "더 큰" 것으로 판정됩니다. 두 리스트를 모두 끝까지 비교했는데 내용이 완전히 같다면 무승부로 처리되어 0이 반환됩니다.

예제

다음 예제는 cmp() 메서드로 리스트를 비교하는 방법을 보여줍니다.

list1, list2 = [456, 'xyz'], [789, 'abc']
print cmp(list1, list2)
print cmp(list2, list1)
list3 = list2 + [896]
print cmp(list2, list3)

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

-1
1
-1

첫 번째 비교에서 list1의 첫 요소 456이 789보다 작으므로 -1, 두 번째 비교에서는 반대이므로 1, 세 번째 비교에서 list2가 list3보다 짧으므로 -1이 반환됩니다.

참고: 파이썬 3에서의 변경 사항

cmp() 함수는 파이썬 2에서만 지원되며, 파이썬 3부터는 표준 내장 함수에서 제거되었습니다. 파이썬 3 환경에서는 다음과 같은 대안을 사용할 수 있습니다.

  • 단순 비교에는 비교 연산자(<, ==, >)를 사용합니다.
  • 정렬용 비교 함수가 필요하면 functools.cmp_to_key()를 활용해 기존의 cmp 스타일 함수를 key 함수로 변환합니다.
import functools

def compare(x, y):
    return (x > y) - (x < y)

sorted_items = sorted([3, 1, 2], key=functools.cmp_to_key(compare))

이처럼 cmp()의 개념은 파이썬 3에서도 비교 로직을 구현할 때 유용하게 응용할 수 있습니다.