Python으로 데이터를 다룰 때 여러 개의 배열(리스트)에 공통으로 존재하는 요소를 찾아야 하는 경우가 종종 발생합니다. 이러한 작업은 배열들을 딕셔너리(dictionary)로 변환한 뒤 교집합 연산을 적용하면 효율적으로 처리할 수 있습니다.
핵심 아이디어는 collections 모듈의 Counter 컨테이너를 활용하는 것입니다. Counter는 각 요소가 몇 번 등장했는지 그 개수(count)를 저장하며, 이를 dict() 함수로 변환하면 일반 딕셔너리 형태로 다룰 수 있습니다. 이후 & 연산자를 사용해 세 배열의 항목(item)들 중 공통된 부분만 추출하고, 마지막으로 새로 만든 딕셔너리의 항목을 순회하면서 등장 횟수만큼 값을 리스트에 추가하면 최종 결과인 공통 값 목록을 얻을 수 있습니다.
예제 코드
from collections import Counter
arrayA = ['Sun', 12, 14, 11, 34]
arrayB = [6, 12, 'Sun', 11]
arrayC = [19, 6, 20, 'Sun', 12, 67, 11]
arrayA = Counter(arrayA)
arrayB = Counter(arrayB)
arrayC = Counter(arrayC)
# 교집합 계산
commonDict = dict(arrayA.items() & arrayB.items() & arrayC.items())
res = []
# 결과 생성
for (key, val) in commonDict.items():
for i in range(0, val):
res.append(key)
print("세 배열의 공통 값은 다음과 같습니다:\n ", res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
세 배열의 공통 값은 다음과 같습니다: ['Sun', 11, 12]
동작 원리 정리
- Counter 변환: 각 배열을
Counter객체로 변환하여 요소별 등장 횟수를 기록합니다. - 교집합 연산: 세 Counter의
items()에&연산자를 적용해 (요소, 개수) 쌍이 완전히 동일한 항목만 남깁니다. - 결과 복원: 교집합 결과를 딕셔너리로 변환한 후, 각 요소를 저장된 개수만큼 반복하여 결과 리스트에 추가합니다.
이 방식은 단순 반복문으로 배열을 비교하는 것보다 코드가 간결하고, 요소의 중복 개수까지 함께 고려한다는 장점이 있습니다. 다만 Counter.items()의 집합 연산은 요소와 개수가 모두 일치해야 하므로, 배열별로 중복 횟수가 다른 경우에는 의도와 다른 결과가 나올 수 있다는 점을 유의해야 합니다.