파이썬으로 데이터 분석을 하다 보면 두 개의 리스트를 비교해서 서로 동일한 요소들을 가지고 있는지 확인해야 하는 경우가 자주 발생합니다. 이 글에서는 리스트의 순서와 상관없이 두 리스트가 같은지 판별하는 대표적인 방법 두 가지를 소개합니다.
1. 정렬(Sort) 후 비교하기
가장 간단한 방법은 두 리스트를 먼저 오름차순으로 정렬한 뒤 비교하는 것입니다. 리스트의 요소 순서가 다르더라도 정렬 후에는 같은 순서가 되므로, 단순히 == 연산자로 동등성을 검사할 수 있습니다.
예제 코드
listA = ['Mon','Tue','Wed','Thu']
listB = ['Mon','Wed','Tue','Thu']
# 주어진 리스트 출력
print("Given listA: ", listA)
print("Given listB: ", listB)
# 리스트 정렬
listA.sort()
listB.sort()
# 동일 여부 확인
if listA == listB:
print("Lists are identical")
else:
print("Lists are not identical")실행 결과
Given listA: ['Mon', 'Tue', 'Wed', 'Thu'] Given listB: ['Mon', 'Wed', 'Tue', 'Thu'] Lists are identical
위 예제에서 listA와 listB는 요소의 순서만 다를 뿐 구성은 같습니다. 따라서 정렬 후 비교하면 두 리스트는 동일하다고 판단됩니다.
2. collections.Counter 활용하기
collections 모듈의 Counter 함수는 리스트 내 각 요소의 등장 횟수(빈도)를 계산해 줍니다. 이 방법은 중복된 요소가 있는 경우에도 유용하게 사용할 수 있습니다. 두 리스트에서 각 요소의 빈도가 모두 같다면, 두 리스트를 동일하다고 판단할 수 있습니다.
예제 코드
import collections
listA = ['Mon','Tue','Wed','Tue']
listB = ['Mon','Wed','Tue','Tue']
# 주어진 리스트 출력
print("Given listA: ", listA)
print("Given listB: ", listB)
# 동일 여부 확인
if collections.Counter(listA) == collections.Counter(listB):
print("Lists are identical")
else:
print("Lists are not identical")
# 다시 한 번 확인
listB = ['Mon','Wed','Wed','Tue']
print("Given listB: ", listB)
# 동일 여부 확인
if collections.Counter(listA) == collections.Counter(listB):
print("Lists are identical")
else:
print("Lists are not identical")실행 결과
Given listA: ['Mon', 'Tue', 'Wed', 'Tue'] Given listB: ['Mon', 'Wed', 'Tue', 'Tue'] Lists are identical Given listB: ['Mon', 'Wed', 'Wed', 'Tue'] Lists are not identical
첫 번째 비교에서는 두 리스트에 포함된 각 요소('Mon' 1개, 'Tue' 2개, 'Wed' 1개)의 빈도가 서로 같기 때문에 동일하다고 판단됩니다. 반면 두 번째 비교에서는 'Wed'의 개수가 달라져(2개 vs 1개) 빈도가 일치하지 않으므로 동일하지 않다고 판단됩니다.
정리
- 정렬 후 비교: 구현이 간단하고 직관적이지만, 원본 리스트의 순서가 변경된다는 점에 유의해야 합니다. 원본을 유지하려면
sorted()함수를 사용하는 것이 좋습니다. - Counter 비교: 중복 요소의 개수까지 정확하게 반영하며, 원본 리스트를 변경하지 않는다는 장점이 있습니다.
두 방법 모두 시간 복잡도는 O(n log n)(정렬) 또는 O(n)(Counter) 수준으로 효율적이므로, 상황에 맞게 선택하여 사용하면 됩니다.