728x90
반응형
Set(집합)
- 파이썬에서 Set(집합)은 리스트(list)나 튜플(tuple)과 마찬가지로 데이터를 담는 컬렉션 자료형
1. Set의 특징
- 1. 순서가 없음 (Unordered): Set은 요소의 순서를 기억X
- 요소를 출력할 때 순서가 임의적(arbitrary)일 수 있음
- 2. 가변적임 (Mutable): 생성 후에 요소를 추가하거나 제거하여 내용을 변경 가능
- 3. 중복된 요소 불허 (No Duplicate Elements): Set의 가장 중요한 특징으로, 리스트나 튜플과 달리 중복된 요소를 허용 X
- Set을 생성할 때 중복된 요소가 있으면 그중 오직 하나만 유지
- 문자열 내에서 몇 개의 서로 다른 문자가 있는지 찾는 등의 유용한 트릭으로 사용
# 순서가 없고, 중복을 허용하지 않음
my_set = {1, 2, 3, 2, 1}
print(my_set)
## 출력: {1, 2, 3} (중복 자동 제거)
2. Set 생성 방법
2.1. 중괄호 사용 (Braces)
- 딕셔너리(Dictionary)와 마찬가지로 중괄호를 사용
- 키-값 쌍(key-value pairs)이 아닌 단일 요소들을 쉼표로 구분
my_set = {1, 2, 3, 1, 2}
# 출력 결과: {1, 2, 3} (중복 제거)
- 만약 my_set에 숫자 1이 두 번, 2가 두 번 포함되어도, Set은 오직 각 요소의 하나만 유지
2.2. 함수 사용
- set() 함수를 사용하여 반복 가능한 객체(iterable EX, 리스트나 문자열)로부터 Set을 생성 가능
my_list = [5, 6, 6, 7]
new_set = set(my_list)
print(new_set)
## 출력: {5, 6, 7}
my_string = "Hello"
char_set = set(my_string)
print(char_set)
## 출력 예시: {'e', 'H', 'l', 'o'} (순서 임의)
2.3. 빈 Set 생성 시 주의사항
- 빈 Set을 만들 때는 특별히 주의 => 단순히 중괄호만 사용하는 경우, 파이썬은 이를 딕셔너리로 인식합니다.
- 따라서 빈 Set을 생성하려면 반드시 set() 메소드를 사용
empty_braces = {}
print(type(empty_braces))
## 출력: <class 'dict'>
empty_set = set()
print(type(empty_set))
## 출력: <class 'set'>
3. Set 요소 관리 및 기본 메서드
- Set은 가변적이므로 요소를 추가하거나 제거할 수 있는 메서드를 제공
|
메서드
|
설명
|
주의사항
|
|
.add(element)
|
Set에 요소를 추가합니다.
|
|
|
.remove(element)
|
Set에서 특정 요소를 제거합니다.
|
제거하려는 요소가 Set 안에 없으면 KeyError가 발생합니다.
|
|
.discard(element)
|
Set에서 특정 요소를 제거합니다.
|
제거하려는 요소가 Set 안에 없더라도 아무 일도 일어나지 않으며 에러가 발생하지 않습니다.
|
|
.clear()
|
Set의 모든 요소를 제거하여 빈 Set으로 만듭니다.
|
|
|
.pop()
|
Set의 임의의(arbitrary) 값을 반환하고 동시에 제거합니다.
|
Set은 순서가 없으므로 어떤 값이 제거될지 예측할 수 없습니다.
|
- len() 메서드를 사용하여 Set 내부의 요소 개수를 확인할 수 있습니다.
fruits = {"apple", "banana"}
# 요소 추가
fruits.add("cherry")
print(fruits)
## 출력 예시: {'banana', 'cherry', 'apple'}
# 요소 제거 (없는 값 제거 시 KeyError)
fruits.remove("banana")
print(fruits)
## 출력 예시: {'apple', 'cherry'}
# discard()는 없는 값 제거해도 오류 X
fruits.discard("mango")
# pop()은 임의의 값 제거
removed = fruits.pop()
print("제거된 값:", removed)
print("남은 Set:", fruits)
# clear()로 전체 제거
fruits.clear()
print(fruits)
## 출력: set()
4. Set 반복 및 요소 확인
- Set의 모든 요소를 순회하려면 간단히 for in 루프를 사용
- 특정 요소가 Set 안에 있는지 확인하려면 if in 구문을 사용
my_set = {1, 2, 3}
# 반복
for i in my_set:
print("요소:", i)
## 출력 (순서 임의):
# 요소: 1
# 요소: 2
# 요소: 3
# 포함 여부 확인
print(2 in my_set)
## 출력: True
5. 집합 연산 (Set Algebra)
- Set은 수학적인 집합 연산을 수행하는 데 매우 유용
- 두 Set(set_A와 set_B)을 사용하여 다양한 연산을 수행
- 이러한 연산 메서드들(union, intersection, difference)은 기본적으로 원본 Set을 수정하지 않고 새로운 Set을 반환
5.1. 합집합 (Union)
- 두 Set의 요소를 중복 없이 결합
set_odd = {1, 3, 5}
set_even = {2, 4, 6}
union_set = set_odd.union(set_even)
print(union_set)
## 출력: {1, 2, 3, 4, 5, 6}
5.2. 교집합 (Intersection)
- 두 Set 모두에 존재하는 요소만 포함하는 Set을 반환
set_primes = {2, 3, 5, 7}
set_odd = {1, 3, 5, 7, 9}
intersection = set_odd.intersection(set_primes)
print(intersection)
## 출력: {3, 5, 7}
5.3. 차집합 (Difference)
- 첫 번째 Set에는 있지만 두 번째 Set에는 없는 요소들로 구성된 Set을 반환
set_A = {1, 2, 3, 4, 5}
set_B = {1, 2, 10}
diff_A_B = set_A.difference(set_B)
print(diff_A_B)
## 출력: {3, 4, 5}
5.4. 대칭 차집합 (Symmetric Difference)
- 두 Set 중 어느 한쪽에만 존재하는 요소들(즉, 두 Set 모두에 있는 요소는 제외)로 구성된 Set을 반환
set_A = {1, 2, 3, 4, 5}
set_B = {1, 2, 10, 11}
sym_diff = set_A.symmetric_difference(set_B)
print(sym_diff)
## 출력: {3, 4, 5, 10, 11}
6. Set 업데이트 메서드 (In-Place Updates)
Set을 수정하는 연산을 수행하고 그 결과를 원본 Set에 반영하려면 업데이트(update) 메서드를 사용합니다.
|
메서드
|
기능
|
설명
|
|
.update(set_B)
|
합집합 업데이트
|
Set B의 요소를 중복 없이 Set A에 추가하여 Set A를 업데이트합니다.
|
|
.intersection_update(set_B)
|
교집합 업데이트
|
두 Set 모두에서 발견된 요소만 Set A에 유지하여 업데이트합니다.
|
|
.difference_update(set_B)
|
차집합 업데이트
|
Set B에서 발견된 Set A의 요소를 제거하여 Set A를 업데이트합니다.
|
|
.symmetric_difference_update(set_B)
|
대칭 차집합 업데이트
|
Set A와 B 중 한쪽에만 있는 요소들만 Set A에 유지하여 업데이트합니다.
|
A = {1, 2, 3}
B = {3, 4, 5}
A.update(B)
print("합집합 업데이트:", A)
## 출력: 합집합 업데이트: {1, 2, 3, 4, 5}
A = {1, 2, 3, 4, 5}
A.intersection_update({2, 3, 6})
print("교집합 업데이트:", A)
## 출력: 교집합 업데이트: {2, 3}
A = {1, 2, 3, 4, 5}
A.difference_update({2, 5})
print("차집합 업데이트:", A)
## 출력: 차집합 업데이트: {1, 3, 4}
A = {1, 2, 3, 4}
A.symmetric_difference_update({3, 4, 5, 6})
print("대칭 차집합 업데이트:", A)
## 출력: 대칭 차집합 업데이트: {1, 2, 5, 6}
7. 집합 간의 관계 확인
- Set 간의 포함 관계나 공통 요소 유무를 확인할 수 있는 메서드
7.1. 부분집합 (Subset)
- set_A.issubset(set_B)는 Set A의 모든 요소가 Set B에 포함되어 있으면 True를 반환
A = {1, 2, 3}
B = {1, 2, 3, 4, 5}
print(A.issubset(B))
## 출력: True
7.2. 상위집합 (Superset)
- set_A.issuperset(set_B)는 Set A가 Set B의 모든 요소를 포함하고 있으면 True를 반환
print(B.issuperset(A))
## 출력: True
7.3. 서로소 (Disjoint)
- set_A.isdisjoint(set_B)는 두 Set이 교집합(공통 요소)이 없으면 True를 반환
A = {1, 2, 3}
C = {4, 5, 6}
print(A.isdisjoint(C))
## 출력: True
8. Set 복사 (Copying)
- 리스트나 딕셔너리와 마찬가지로 Set 역시 단순히 할당 연산자(=)를 사용하면 원본 Set의 참조만 복사
- 복사본을 수정하면 원본도 변경
original = {1, 2, 3}
copy = original
copy.add(4)
print("original:", original)
## 출력: original: {1, 2, 3, 4}
- 1. .copy() 메서드: set_B = set_A.copy()
- 2. set() 함수: set_B = set(set_A)
original = {1, 2, 3}
copy1 = original.copy()
copy1.add(99)
print(".copy() 사용:", original, copy1)
## 출력: .copy() 사용: {1, 2, 3} {1, 2, 3, 99}
copy2 = set(original)
copy2.add(77)
print("set() 사용:", original, copy2)
## 출력: set() 사용: {1, 2, 3} {1, 2, 3, 77}
9. Frozen Set (불변 Set)
- Frozen Set은 일반 Set의 불변(immutable) 버전인 컬렉션 자료형
- frozenset() 메소드를 사용하여 생성하며, 생성된 후에는 요소를 변경 X
- .add(), .remove() 같은 수정 메서드나 모든 업데이트(update) 메서드는 작동 X
frozen = frozenset([1, 2, 3])
print(frozen)
## 출력: frozenset({1, 2, 3})
# 요소 추가 시 에러 발생
try:
frozen.add(4)
except AttributeError as e:
print("오류 발생:", e)
## 출력: 오류 발생: 'frozenset' object has no attribute 'add'
- 하지만 Union, Intersection, Difference와 같은 집합 연산은 여전히 사용 가능
A = frozenset([1, 2, 3])
B = frozenset([3, 4, 5])
print(A.union(B))
## 출력: frozenset({1, 2, 3, 4, 5})
print(A.intersection(B))
## 출력: frozenset({3})
- Frozen Set은 (불변 타입이므로) 딕셔너리의 키(key)로 사용될 수 있다는 장점 (일반 Set은 가변적이라 딕셔너리 키로 사용할 수 없습니다.) => dictionary 에 대해서 알고싶다면 https://jk25.tistory.com/209 를 방문하세요
frozen_key = frozenset({1, 2, 3})
my_dict = {frozen_key: "immutable key"}
print(my_dict)
## 출력: {frozenset({1, 2, 3}): 'immutable key'}
728x90
반응형
'프로그래밍 > Python' 카테고리의 다른 글
| [파이썬 / 기본] collections (0) | 2025.10.20 |
|---|---|
| [파이썬 / 기본] String " " (0) | 2025.10.19 |
| [파이썬 / 기본] Dictionary {} (0) | 2025.10.16 |
| [파이썬 / 기본] Tuple () (0) | 2025.10.15 |
| [파이썬 / 기본] Lists (0) | 2025.10.15 |