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

Python에서 두 리스트가 동일한지 비교하는 방법

파이썬으로 데이터 분석을 하다 보면 두 개의 리스트를 비교해서 서로 동일한 요소들을 가지고 있는지 확인해야 하는 경우가 자주 발생합니다. 이 글에서는 리스트의 순서와 상관없이 두 리스트가 같은지 판별하는 대표적인 방법 두 가지를 소개합니다.

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

위 예제에서 listAlistB는 요소의 순서만 다를 뿐 구성은 같습니다. 따라서 정렬 후 비교하면 두 리스트는 동일하다고 판단됩니다.

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) 수준으로 효율적이므로, 상황에 맞게 선택하여 사용하면 됩니다.