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

Python에서 중복을 유지하며 두 리스트의 차이 구하기

프로그래밍을 하다 보면 두 리스트 간의 차이를 구해야 하는 경우가 자주 발생합니다. 이는 수학적인 뺄셈과 유사한 개념으로, 첫 번째 리스트에 있는 요소 중 두 번째 리스트에도 존재하는 요소들을 제거하는 작업을 의미합니다. 특히 중요한 점은 중복된 요소들이 그대로 보존되어야 한다는 것입니다.

collections.Counter를 활용한 방법

Python에서는 collections 모듈의 Counter 클래스를 사용하면 이 문제를 깔끔하게 해결할 수 있습니다. Counter는 각 요소의 등장 횟수를 추적해 주기 때문에, 단순한 수학적 뺄셈만으로 원하는 결과를 얻을 수 있습니다.

동작 원리는 다음과 같습니다. 먼저 각 리스트를 Counter 객체로 변환하여 요소별 개수를 계산합니다. 그런 다음 첫 번째 Counter에서 두 번째 Counter를 빼면, 각 요소의 남은 개수가 계산됩니다. 최종 결과에서 어떤 요소가 몇 번 남는지는 첫 번째 리스트와 두 번째 리스트에서 해당 요소가 등장한 횟수의 차이로 결정됩니다.

예제 코드

from collections import Counter

# 리스트 초기화
listA = ['Mon', 'Tue', 9, 3, 3]
listB = ['Mon', 3]

# 원본 리스트 출력
print("Given ListA : ", listA)
print("Given ListB : ", listB)

# collections.Counter() 적용
diff_list = list((Counter(listA) - Counter(listB)).elements())

# 결과 출력
print("Result of list subtraction : ", diff_list)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

Given ListA : ['Mon', 'Tue', 9, 3, 3]
Given ListB : ['Mon', 3]
Result of list subtraction : ['Tue', 9, 3]

결과 분석

결과를 자세히 살펴보면 다음과 같은 동작을 확인할 수 있습니다.

  • 'Mon': listA에 1번, listB에 1번 등장했으므로 1 - 1 = 0개가 되어 결과에서 제거됩니다.
  • 'Tue': listB에 없으므로 그대로 1개가 유지됩니다.
  • 9: listB에 없으므로 그대로 유지됩니다.
  • 3: listA에 2번, listB에 1번 등장했으므로 2 - 1 = 1개만 결과에 남습니다. 즉, 중복이 완전히 제거되지 않고 개수만큼 차감됩니다.

이처럼 Counter를 활용하면 단순 집합 연산(set)과 달리 중복 요소의 개수까지 정확하게 반영된 차집합을 구할 수 있어, 데이터 처리나 로그 분석 등에서 매우 유용하게 활용됩니다.