집합 (Sets)

2025. 3. 26. 02:08Programming 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