3. 집합 자료형 (Set)
파이썬의 집합(Set) 자료형은 딕셔너리와 비슷하게 ‘해시(Hash)’ 기술을 사용하여 데이터를 관리하지만, 값(Value)은 없고 오로지 키(Key) 역할의 데이터만 담아두는 특별한 주머니입니다.
수학 시간의 집합 개념을 프로그래밍 세계로 완벽히 이식한 구조결과물이기 때문에, 다음과 같은 주요 특징을 갖습니다.
- 중복 절대 불가: 동일한 값이 두 번 들어가는 것을 애초에 차단합니다. (해시 기반 고유성 유지)
- 순서 없음: 인덱스 번호가 존재하지 않으므로 순서대로 뽑아쓰는 개념이 없습니다.
- 강력한 수학 연산: 교집합, 합집합, 차집합 등의 계산을 단 한 줄의 코드로 처리합니다.
3.1 집합의 생성
딕셔너리와 마찬가지로 중괄호 {} 를 사용하지만, 콜론(:) 없이 값들만 단순히 나열하면 파이썬은 이를 집합으로 인식합니다.
# 1. 리터럴 표기법을 이용한 생성
prime_set = {2, 3, 5, 7}
print(prime_set) # {2, 3, 5, 7}
# 2. 리스트를 집합으로 강제 캐스팅 (중복 제거에 탁월!)
duplicated_list = [1, 2, 2, 3, 3, 3]
unique_set = set(duplicated_list)
print(unique_set) # {1, 2, 3} (중복 데이터가 단번에 증발함)
# 3. 빈 집합 만들기 (주의)
# empty = {} 이렇게 쓰면 빈 "딕셔너리"가 되어버립니다!
real_empty_set = set() # 반드시 생성자를 명시적으로 호출해야 함
3.2 수학적 집합 연산 기법
대량의 데이터 더미 2개가 있을 때, 공통점이나 차이점을 눈 깜짝할 새에 뽑아내는 집합 연산자들을 제공합니다. 연산 기호(|, &, -, ^)나 메서드를 자유롭게 사용할 수 있으며, 연산 결과는 항상 원본을 훼손하지 않는 “새로운 집합”을 반환합니다.
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
# 1. 합집합 (Union)
print(A | B) # {1, 2, 3, 4, 5, 6}
# 2. 교집합 (Intersection)
print(A & B) # {3, 4}
# 3. 차집합 (Difference)
print(A - B) # {1, 2}
# 4. 대칭 차집합 (서로 겹치지 않는 나머지 / Symmetric Difference)
print(A ^ B) # {1, 2, 5, 6}
포함 관계(크기) 판별
두 집합이 부분집합 관계인지, 혹은 완전히 포함하는 관계인지를 issubset (부분집합), issuperset (상위집합) 스킬을 통해 불리언 값(True / False)으로 검사할 수 있습니다.
print({1, 2}.issubset({1, 2, 3})) # True (1,2는 1,2,3의 내부 요건을 충족함)
3.3 집합 내부 원소의 조작과 방어
set 인스턴스 자체는 변경 가능(Mutable) 객체이기 때문에, 집합이 만들어진 이후에도 자유롭게 원소를 뺏다 넣었다 할 수 있습니다.
add(값): 단 하나의 요소를 집합에 새롭게 편성합니다.remove(값)/discard(값): 지정한 원소를 삭제합니다. 단,remove는 지우려는 값이 없으면 시스템 에러(KeyError)를 뱉지만,discard는 없어도 침묵하며 무시합니다.pop(): 무작위로 원소 하나를 터뜨려 뽑아옵니다.
변경 절대 불가 집합: 프로즌셋 (frozenset)
일반적인 set은 변경 가능하므로 “딕셔너리의 Key”로 사용할 수 없습니다. 집합 구조인데 변경마저 절대 불가능하게 얼려버리고 싶다면 파이썬이 제공하는 frozenset 클래스를 이용해야 합니다.
frozen_group = frozenset([1, 2, 3])
# frozen_group.add(4) -> AttributeError! 얼어붙어있으므로 요소 추가/삭제 불가
# 완벽한 불변이므로 딕셔너리의 Key로 채택될 수 있는 특권이 주어집니다.
dict_with_set_key = {frozen_group: "보안구역"}
서브목차