파이썬에서 리스트(list)는 유사한 항목들을 담는 자료구조입니다. 실제 개발을 하다 보면 특정 작업을 수행하기 위해 두 리스트에 담긴 데이터를 서로 비교해야 하는 경우가 자주 발생합니다. 이번 글에서는 파이썬에서 두 리스트를 비교하는 대표적인 방법들을 상황별로 살펴보겠습니다.
1. list.sort()와 == 연산자 사용
list.sort() 메서드로 두 리스트를 각각 정렬한 뒤, == 연산자로 항목별로 비교하는 방법입니다. 같은 위치에 같은 값이 있는지 확인하므로, 리스트가 동일한 데이터 값을 담고 있는지 검사할 수 있습니다.
단, 이 방법은 요소의 순서를 고려하지 않습니다. 따라서 [1,2,3]과 [2,1,3]도 같은 리스트로 판단됩니다.
예제
def compareList(l1,l2):
l1.sort()
l2.sort()
if(l1==l2):
return "Equal"
else:
return "Non equal"
l1=[1,2,3]
l2=[2,1,3]
print("First comparison",compareList(l1,l2))
l3=[1,2,3]
l4=[1,2,4]
print("Second comparison",compareList(l3,l4))실행 결과
First comparison Equal Second comparison Non equal
첫 번째 비교에서는 요소 구성이 같으므로 순서가 달라도 "Equal"이 출력되고, 두 번째 비교에서는 값 자체가 다르므로 "Non equal"이 출력됩니다.
2. collections.Counter() 사용
collections 모듈의 Counter 클래스를 활용하면 각 요소의 등장 빈도(개수)를 기준으로 두 리스트를 비교할 수 있습니다. 첫 번째 리스트의 각 요소 빈도가 두 번째 리스트의 빈도와 모두 일치하면 같은 리스트로 판단합니다.
이 방법 역시 요소의 순서를 고려하지 않으며, 원본 리스트를 변경하지 않는다는 점에서 sort() 방식보다 안전합니다.
예제
import collections
def compareList(l1,l2):
if(collections.Counter(l1)==collections.Counter(l2)):
return "Equal"
else:
return "Non equal"
l1=[1,2,3]
l2=[2,1,3]
print("First comparison",compareList(l1,l2))
l3=[1,2,3]
l4=[1,2,4]
print("Second comparison",compareList(l3,l4))실행 결과
First comparison Equal Second comparison Non equal
[1,2,3]과 [2,1,3]은 각 요소의 개수가 동일하므로 "Equal", [1,2,3]과 [1,2,4]는 3과 4가 다르므로 "Non equal"이 출력됩니다.
3. sum(), zip(), len() 조합 사용
zip()으로 두 리스트의 요소를 하나씩 짝지어 비교하고, 값이 일치할 때마다 1을 더한 합계를 리스트 길이와 비교하는 방식입니다. 두 리스트의 길이가 같은지 먼저 확인한 후에 계산을 수행해야 합니다.
이 방법의 가장 큰 특징은 요소의 순서까지 검사한다는 점입니다. 즉, [1,2,3]과 [2,1,3]은 다른 리스트로 판단됩니다.
예제
def compareList(l1,l2):
if(len(l1)==len(l2) and len(l1)==sum([1 for i,j in zip(l1,l2) if i==j])):
return "Equal"
else:
return "Non equal"
l1=[1,2,3]
l2=[2,1,3]
print("First comparison",compareList(l1,l2))
l3=[1,2,3]
l4=[1,2,3]
print("Second comparison",compareList(l3,l4))실행 결과
First comparison Non equal Second comparison Equal
위 예제의 첫 번째 비교에서 두 리스트의 데이터 값은 같지만 요소의 순서가 다르기 때문에 "Non equal"이 출력됩니다. 순서까지 완전히 일치하는 두 번째 비교만 "Equal"로 판단됩니다.
4. == 연산자 단독 사용
첫 번째 방법에서 정렬 과정을 제거한 방식입니다. 리스트를 그대로 놓고 == 연산자로 비교하므로, 데이터 항목의 순서까지 엄격하게 비교합니다. 파이썬에서 두 리스트가 완전히 동일한지 확인하는 가장 간단하고 직관적인 방법입니다.
예제
def compareList(l1,l2):
if(l1==l2):
return "Equal"
else:
return "Non equal"
l1=[1,2,3]
l2=[2,1,3]
print("First comparison",compareList(l1,l2))
l3=[1,2,3]
l4=[1,2,3]
print("Second comparison",compareList(l3,l4))실행 결과
First comparison Non equal Second comparison Equal
마무리: 어떤 방법을 선택해야 할까?
정리하면, 리스트를 비교할 때 순서를 무시하고 구성 요소만 비교하려면 collections.Counter()를, 순서까지 포함해 완전히 동일한지 비교하려면 == 연산자를 사용하는 것이 좋습니다. 상황과 목적에 맞는 방법을 선택해 효율적으로 리스트를 비교해 보세요.