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

파이썬으로 세트 리스트에서 중복 세트 찾기 — Counter와 frozenset 활용법

세트(set)로 이루어진 리스트 안에서 중복된 세트를 찾아야 할 때는 파이썬의 Counterfrozenset을 함께 사용하면 아주 간단하게 해결할 수 있습니다.

핵심 아이디어

일반적인 세트는 변경 가능(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})이 결과로 반환됩니다.