집합 (Sets)
2025. 3. 26. 02:08ㆍProgramming Languages/Python
집합 (Sets)
집합은 순서가 없고, 중복된 요소를 포함하지 않는 컬렉션입니다. 집합은 수학적 집합 연산(합집합, 교집합, 차집합 등)을 지원합니다. 중괄호 {}를 사용하여 표현하지만, 빈 집합은 set()으로 생성해야 합니다.
집합 생성하기
# 빈 집합 생성 (주의: {}는 빈 딕셔너리를 생성)
empty_set = set()
print(type(empty_set)) # <class 'set'>
# 값이 있는 집합 생성
fruits = {"apple", "banana", "cherry", "apple"} # 중복된 "apple"은 한 번만 저장됨
print(fruits) # {'banana', 'cherry', 'apple'} (순서는 보장되지 않음)
# 다른 시퀀스로부터 집합 생성
numbers = set([1, 2, 3, 2, 1])
print(numbers) # {1, 2, 3}
letters = set("hello")
print(letters) # {'h', 'e', 'l', 'o'} (중복된 'l'은 한 번만 저장됨)
집합 항목 추가 및 삭제
fruits = {"apple", "banana", "cherry"}
# 항목 추가
fruits.add("date")
print(fruits) # 'date' 항목 추가됨
# 여러 항목 추가
fruits.update(["elderberry", "fig", "grape"])
print(fruits) # 'elderberry', 'fig', 'grape' 항목 추가됨
# 항목 삭제 (remove)
fruits.remove("banana") # 항목이 없으면 KeyError 발생
print(fruits) # 'banana' 항목 삭제됨
# 항목 삭제 (discard) - 항목이 없어도 오류 없음
fruits.discard("kiwi") # 항목이 없어도 오류 발생하지 않음
fruits.discard("cherry")
print(fruits) # 'cherry' 항목 삭제됨
# 임의의 항목 제거 및 반환
popped = fruits.pop() # 임의의 항목 반환 및 삭제
print(popped)
print(fruits) # 임의의 항목 삭제됨
# 모든 항목 삭제
fruits.clear()
print(fruits) # set()
집합 연산
집합은 수학적 집합 연산을 지원하며, 이를 통해 데이터를 효율적으로 처리할 수 있습니다.
# 기본 집합
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 합집합 (Union): A ∪ B
union1 = A | B
union2 = A.union(B)
print(union1) # {1, 2, 3, 4, 5, 6, 7, 8}
print(union2) # {1, 2, 3, 4, 5, 6, 7, 8}
# 교집합 (Intersection): A ∩ B
intersection1 = A & B
intersection2 = A.intersection(B)
print(intersection1) # {4, 5}
print(intersection2) # {4, 5}
# 차집합 (Difference): A - B
difference1 = A - B
difference2 = A.difference(B)
print(difference1) # {1, 2, 3}
print(difference2) # {1, 2, 3}
# 대칭 차집합 (Symmetric Difference): (A - B) ∪ (B - A)
sym_diff1 = A ^ B
sym_diff2 = A.symmetric_difference(B)
print(sym_diff1) # {1, 2, 3, 6, 7, 8}
print(sym_diff2) # {1, 2, 3, 6, 7, 8}
집합 관계 확인
집합 간의 관계(부분집합, 상위집합, 서로소 등)를 확인할 수 있습니다.
A = {1, 2, 3, 4, 5}
B = {1, 2, 3}
C = {6, 7, 8}
D = {1, 2, 3, 4, 5}
# 부분집합 (Subset) 확인: B ⊆ A
print(B.issubset(A)) # True
print(B <= A) # True
print(A.issubset(B)) # False
# 진부분집합 (Proper Subset) 확인: B ⊂ A
print(B < A) # True
print(A < D) # False (A와 D는 같은 집합)
# 상위집합 (Superset) 확인: A ⊇ B
print(A.issuperset(B)) # True
print(A >= B) # True
print(B.issuperset(A)) # False
# 진상위집합 (Proper Superset) 확인: A ⊃ B
print(A > B) # True
print(A > D) # False (A와 D는 같은 집합)
# 서로소 (Disjoint) 확인: A ∩ C = ∅
print(A.isdisjoint(C)) # True (공통 요소 없음)
print(A.isdisjoint(B)) # False (공통 요소 있음)
집합 메서드와 연산자
A = {1, 2, 3, 4, 5} # A 재설정
C4 = A.symmetric_difference(B) # 새 집합 반환
print(A) # 원본 유지: {1, 2, 3, 4, 5}
print(C4) # {1, 2, 3, 6, 7, 8}
A.symmetric_difference_update(B) # A 자체를 수정
print(A) # {1, 2, 3, 6, 7, 8}
집합 컴프리헨션 (Set Comprehension)
리스트 컴프리헨션과 유사하게, 집합 컴프리헨션을 사용하여 간결하게 집합을 생성할 수 있습니다.
# 기본 문법: {expr for item in iterable}
# 1부터 10까지의 숫자 중 짝수의 제곱을 포함하는 집합
even_squares = {x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares) # {4, 16, 36, 64, 100}
# 문자열에서 모음만 추출한 집합
text = "Hello, World!"
vowels = {char.lower() for char in text if char.lower() in 'aeiou'}
print(vowels) # {'e', 'o'}
# 여러 리스트에서 공통 요소 찾기
list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
list3 = [5, 6, 7, 8, 9]
common = {x for x in list1 if x in list2 and x in list3}
print(common) # {5}
불변 집합 (Frozen Set)
frozenset은 요소를 변경할 수 없는(immutable) 집합입니다. 일반 집합과 달리 생성 후에는 요소를 추가하거나 제거할 수 없습니다. 이러한 특성 때문에 딕셔너리의 키나 다른 집합의 요소로 사용할 수 있습니다.
# frozenset 생성
frozen = frozenset([1, 2, 3, 4, 5])
print(frozen) # frozenset({1, 2, 3, 4, 5})
# 집합 연산은 가능
another_set = {4, 5, 6, 7, 8}
union_result = frozen.union(another_set)
print(union_result) # frozenset({1, 2, 3, 4, 5, 6, 7, 8})
# 수정 시도 (오류 발생)
try:
frozen.add(6) # AttributeError: 'frozenset' object has no attribute 'add'
except AttributeError as e:
print(f"오류 발생: {e}")
# 딕셔너리 키로 사용
preferences = {
frozenset(['파이썬', '자바스크립트']): "웹 개발자",
frozenset(['자바', 'C++']): "시스템 개발자",
frozenset(['파이썬', 'R']): "데이터 분석가"
}
# 사용자 기술 세트로 직업 추천
user_skills = frozenset(['파이썬', 'R', 'SQL'])
for skills, job in preferences.items():
if skills.issubset(user_skills):
print(f"당신의 기술로 '{job}' 직업을 추천합니다.")
'Programming Languages > Python' 카테고리의 다른 글
| 함수 (Functions) (2) | 2025.03.26 |
|---|---|
| collections 모듈의 특수 컬렉션 (0) | 2025.03.26 |
| 딕셔너리 (Dictionaries) (1) | 2025.03.26 |
| 시퀀스 타입의 공통 연산 (0) | 2025.03.25 |
| 튜플 (Tuples) (0) | 2025.03.25 |