본문 바로가기

프로그래밍/Python

[파이썬 / 기본] Set {} 집합

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