세트(set)로 이루어진 리스트 안에서 중복된 세트를 찾아야 할 때는 파이썬의 Counter와 frozenset을 함께 사용하면 아주 간단하게 해결할 수 있습니다.
핵심 아이디어
일반적인 세트는 변경 가능(mutable)한 객체이기 때문에 해시(hash) 값을 가질 수 없어 Counter의 키로 직접 사용할 수 없습니다. 반면 frozenset은 불변(immutable) 객체이므로 해시가 가능하며, 이를 활용하면 세트 자체를 빈도 계산의 기준으로 삼을 수 있습니다.
예제 코드
다음은 세트 리스트에서 중복 세트를 찾는 과정을 보여주는 예제입니다.
from collections import Counter
my_list = [{4, 8, 6, 1}, {6, 4, 1, 8}, {1, 2, 6, 2}, {1, 4, 2}, {7, 8, 9}]
print("The list is :")
print(my_list)
my_freq = Counter(frozenset(sub) for sub in my_list)
my_result = []
for key, value in my_freq.items():
if value > 1 :
my_result.append(key)
print("The result is :")
print(my_result)
실행 결과
The list is :
[{8, 1, 4, 6}, {8, 1, 4, 6}, {1, 2, 6}, {1, 2, 4}, {8, 9, 7}]
The result is :
[frozenset({8, 1, 4, 6})]
코드 설명
여러 개의 세트 값을 담고 있는 리스트를 정의한 뒤, 콘솔에 그대로 출력합니다.
리스트를 순회하면서 각 세트를
frozenset으로 변환하고, 이를Counter에 전달합니다.이 과정을 통해 리스트 내 모든 세트의 등장 빈도를 계산할 수 있습니다.
계산된 빈도 정보는 변수
my_freq에 저장됩니다.중복 세트를 담아둘 빈 리스트
my_result를 생성합니다.my_freq의 항목을 하나씩 확인하면서, 빈도가 1보다 큰 경우(즉 두 번 이상 등장한 세트) 해당 키를 결과 리스트에 추가합니다.마지막으로 최종 결과를 콘솔에 출력합니다.
위 예제에서는 {4, 8, 6, 1}과 {6, 4, 1, 8}처럼 요소의 나열 순서가 달라도 세트는 동일한 값으로 취급되므로, 두 세트가 중복으로 인식되어 frozenset({8, 1, 4, 6})이 결과로 반환됩니다.