파이썬 frozenset() 사용법 6가지 및 주의사항

파이썬 frozenset() 함수는 불변 집합 자료형을 다루는데 사용합니다. 파이썬에서 자주 사용하는 set은 집합 자료형으로, 중복되지 않는 데이터를 관리하는데 유용합니다. 하지만 set은 수정 가능(mutable)하기 때문에, 이 특성 때문에 특정 상황에서는 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위해 등장한 것이 바로 frozenset입니다. 이번 포스팅에서는 파이썬의 frozenset()에 대해 알아보고, 이를 어떻게 활용할 수 있는지, 주의해야 할 점은 무엇인지 자세히 살펴보겠습니다.

frozenset()이란?

frozenset()은 파이썬에서 제공하는 불변(immutable) 집합 자료형입니다. 기본적인 사용법과 특성은 set과 유사하지만, set과 달리 생성된 후 값을 변경할 수 없습니다. 즉, 데이터를 추가하거나 삭제하는 등의 수정 작업이 불가능합니다.

기본 사용법

frozenset()은 다음과 같은 형식으로 사용할 수 있습니다.

Python
fs = frozenset([1, 2, 3, 4])
print(fs)

이 코드의 실행 결과는 아래 그림과 같습니다. frozenset()은 리스트, 튜플, 문자열과 같은 반복 가능한(iterable) 객체를 입력받아, 이를 불변 집합으로 변환합니다.

그림 1. 파이썬 frozenset(): list를 불변 집합으로 생성
그림 1. 파이썬 frozenset(): list를 불변 집합으로 생성

frozenset()이 유용한 이유

set은 가변적이기 때문에, 해시가 불가능한(unhashable) 자료형입니다. 해시가 가능하다는 것은 자료형이 고유의 값을 가지고, 변경되지 않는다는 의미로, 딕셔너리의 키나 다른 집합의 요소로 사용할 수 있습니다. 반면, frozenset은 불변이므로 해시 가능(hashable)하며, 딕셔너리의 키집합의 요소로 사용할 수 있습니다. 이러한 특성 덕분에 frozenset은 보다 안정적인 데이터 관리가 가능합니다.

frozenset()의 주요 메서드

frozenset()은 불변이므로 데이터를 수정하는 메서드는 사용할 수 없지만, 몇 가지 유용한 메서드들이 제공됩니다. set과 동일하게 다음 메서드들을 지원합니다:

union(): 합집합

합집합은 두 집합을 결합하여 새로운 집합을 만듭니다. frozenset에서도 union() 메서드를 사용할 수 있습니다.

Python
fs1 = frozenset([1, 2, 3, 4])
fs2 = frozenset([3, 4, 5, 6])
result = fs1.union(fs2)
print(result)
그림 2. 파이썬 frozenset(): union() 메서드로 합집합 구하기
그림 2. 파이썬 frozenset(): union() 메서드로 합집합 구하기

intersection(): 교집합

교집합은 두 집합에서 공통으로 존재하는 요소들만을 포함합니다.

Python
fs1 = frozenset([1, 2, 3, 4])
fs2 = frozenset([2, 3, 4, 5, 6])
result = fs1.intersection(fs2)
print(result)
그림 3. 파이썬 frozenset(): intersection() 메서드로 교집합 구하기
그림 3. 파이썬 frozenset(): intersection() 메서드로 교집합 구하기

difference(): 차집합

차집합은 첫 번째 집합에서 두 번째 집합의 요소들을 뺀 나머지를 반환합니다.

Python
fs1 = frozenset([1, 2, 3, 4])
fs2 = frozenset([2, 3, 4, 5])
result = fs1.difference(fs2)
print(result)
그림 4. 파이썬 frozenset(): difference() 메서드로 차집합 구하기
그림 4. 파이썬 frozenset(): difference() 메서드로 차집합 구하기

issubset(), issuperset(): 부분집합 및 상위집합 확인

frozenset을 사용하여 한 집합이 다른 집합의 부분집합인지 또는 상위집합인지 확인할 수 있습니다.

Python
fs1 = frozenset([1, 2])
fs2 = frozenset([1, 2, 3, 4, 5])
print(fs1.issubset(fs2))
print(fs2.issuperset(fs1))
그림 5. 파이썬 frozenset(): issubset()으로 부분집합 확인 및 issuperset()으로 상위집합 확인
그림 5. 파이썬 frozenset(): issubset()으로 부분집합 확인 및 issuperset()으로 상위집합 확인

주의사항

frozenset을 사용할 때는 몇 가지 주의해야 할 사항이 있습니다:

불변성으로 인한 제약

frozenset은 불변이므로 한 번 생성된 후에는 값을 변경할 수 없습니다. 따라서 데이터를 추가하거나 삭제해야 하는 상황에서는 frozenset을 사용하면 안 됩니다. 예를 들어, add()remove() 메서드를 사용하려고 하면 오류가 발생합니다.

해시 가능성

frozenset은 불변이므로 해시 가능하다는 장점이 있지만, 모든 경우에 이를 사용하는 것이 적절하지 않을 수 있습니다. 예를 들어, 자주 변경되는 데이터를 관리해야 한다면 오히려 frozenset이 불편할 수 있습니다. 이럴 때는 가변적인 set을 사용하는 것이 더 적합합니다.

frozenset의 활용 방법

frozenset은 다음과 같은 상황에서 유용하게 활용될 수 있습니다:

딕셔너리의 키로 사용

딕셔너리의 키는 해시 가능한 값이어야 하므로, 가변적인 set 대신 frozenset을 키로 사용할 수 있습니다.

Python
my_dict = {frozenset([1, 2, 3]): "value"}
print(my_dict)
그림 6. 파이썬 frozenset을 dictionary의 키로 사용
그림 6. 파이썬 frozenset을 dictionary의 키로 사용

다른 집합의 요소로 사용

frozenset은 해시 가능하므로, 다른 집합의 요소로 사용할 수 있습니다.

Python
nested_set = {frozenset([1, 2]), frozenset([3, 4])}
print(nested_set)
그림 7. 파이썬 frozenset을 set의 요소로 사용
그림 7. 파이썬 frozenset을 set의 요소로 사용

이와 같은 방법으로 frozenset은 안정적이고 불변한 데이터 관리가 필요한 경우에 매우 유용합니다.

정리

frozenset()은 파이썬에서 불변 집합을 제공하는 유용한 도구입니다. 가변적인 set과 달리 값을 수정할 수 없다는 제약이 있지만, 해시 가능하고 안정적인 데이터 관리가 필요할 때 강력한 기능을 발휘합니다. 딕셔너리의 키나 집합의 요소로 사용할 수 있으며, 교집합, 합집합, 차집합 등 다양한 집합 연산도 지원합니다.

따라서 데이터의 수정이 필요 없는 상황에서는 frozenset을 적극적으로 활용해보세요. 불변성으로 인해 발생할 수 있는 오류를 방지하고, 코드의 안정성을 높일 수 있습니다.

참고자료

관련 포스트

Leave a Comment