세트는 파이썬의 내장 자료형 중 하나로, 고유한 값을 저장하는 불변 자료형이다. 세트는 중복된 값을 허용하지 않으며, 순서가 없는 컬렉션이다. 따라서 인덱싱이나 슬라이싱을 사용할 수 없지만, 효율적인 집합 연산을 지원한다. 세트는 중괄호 {} 또는 set() 함수를 사용하여 정의할 수 있다.
1. 세트 정의 및 기본 사용법
# 빈 세트 정의
empty_set = set()
# 요소가 있는 세트 정의
fruits = {"apple", "banana", "cherry"}
numbers = {1, 2, 3, 4, 5}
# 중복된 값은 자동으로 제거된다
duplicates = {1, 2, 2, 3, 4, 4, 5}
print(duplicates) # 출력: {1, 2, 3, 4, 5}
print(fruits) # 출력: {'apple', 'banana', 'cherry'}
print(numbers) # 출력: {1, 2, 3, 4, 5}
2. 세트의 요소 추가 및 삭제
요소 추가
세트에 요소를 추가하려면 add() 메서드를 사용한다.
fruits.add("date")
print(fruits) # 출력: {'apple', 'banana', 'cherry', 'date'}
요소 삭제
세트에서 요소를 삭제하려면 remove(), discard(), pop() 메서드를 사용한다.
remove(): 지정한 요소를 삭제하며, 요소가 존재하지 않으면 KeyError가 발생한다.
discard(): 지정한 요소를 삭제하며, 요소가 존재하지 않아도 오류가 발생하지 않는다.
pop(): 임의의 요소를 제거하고 반환한다. 세트가 비어 있으면 KeyError가 발생한다.
fruits.remove("banana")
print(fruits) # 출력: {'apple', 'cherry', 'date'}
fruits.discard("cherry")
print(fruits) # 출력: {'apple', 'date'}
element = fruits.pop()
print(element) # 출력: 'apple' (임의의 요소가 제거됨)
print(fruits) # 출력: {'date'}
모든 요소 삭제
fruits.clear()
print(fruits) # 출력: set()
3. 세트의 집합 연산
세트는 수학적 집합 연산을 지원한다. 주요 집합 연산은 다음과 같다:
합집합 (Union): 두 세트의 모든 요소를 포함하는 세트를 반환한다.
교집합 (Intersection): 두 세트에 공통으로 포함된 요소를 반환한다.
차집합 (Difference): 첫 번째 세트에는 있지만 두 번째 세트에는 없는 요소를 반환한다.
대칭 차집합 (Symmetric Difference): 두 세트 중 한 세트에만 포함된 요소를 반환한다.
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 합집합
union = A | B
print(union) # 출력: {1, 2, 3, 4, 5, 6, 7, 8}
# 교집합
intersection = A & B
print(intersection) # 출력: {4, 5}
# 차집합
difference = A - B
print(difference) # 출력: {1, 2, 3}
# 대칭 차집합
symmetric_difference = A ^ B
print(symmetric_difference) # 출력: {1, 2, 3, 6, 7, 8}
4. 세트 메서드
세트는 다양한 메서드를 제공하여 집합 연산을 수행할 수 있다.
union(): 합집합을 반환한다.
intersection(): 교집합을 반환한다.
difference(): 차집합을 반환한다.
symmetric_difference(): 대칭 차집합을 반환한다.
issubset(): 첫 번째 세트가 두 번째 세트의 부분집합인지 여부를 반환한다.
issuperset(): 첫 번째 세트가 두 번째 세트를 포함하는지 여부를 반환한다.
isdisjoint(): 두 세트가 서로 공통 요소가 없는지 여부를 반환한다.
A = {1, 2, 3}
B = {3, 4, 5}
print(A.union(B)) # 출력: {1, 2, 3, 4, 5}
print(A.intersection(B)) # 출력: {3}
print(A.difference(B)) # 출력: {1, 2}
print(A.symmetric_difference(B)) # 출력: {1, 2, 4, 5}
print(A.issubset(B)) # 출력: False
print(A.issuperset(B)) # 출력: False
print(A.isdisjoint(B)) # 출력: False
5. 세트와 반복문
세트는 반복문을 사용하여 순회할 수 있다.
fruits = {"apple", "banana", "cherry"}
for fruit in fruits:
print(fruit)
6. 불변 세트 (frozenset)
frozenset은 불변 세트로, 생성 후에는 요소를 추가, 삭제할 수 없다. 불변 세트는 frozenset() 함수를 사용하여 생성할 수 있다.
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])
print(A | B) # 출력: frozenset({1, 2, 3, 4, 5, 6})
print(A & B) # 출력: frozenset({3, 4})
print(A - B) # 출력: frozenset({1, 2})
print(A ^ B) # 출력: frozenset({1, 2, 5, 6})
7. 세트 컴프리헨션(Set Comprehension)
Set Comprehension은 리스트 컴프리헨션(list comprehension)과 유사하게, 반복문과 조건문을 사용하여 집합을 간결하게 생성할 수 있는 문법이다. 중괄호 {}를 사용하여 표현하며, 다음과 같은 형식을 따른다.
{ 표현식 for 요소 in 반복 가능한 객체 if 조건 }
다음은 Set Comprehension의 다양한 예제들이다.
numbers = {x for x in range(1, 6)}
print(numbers)
even_numbers = {x for x in range(1, 11) if x % 2 == 0}
print(even_numbers)
unique_chars = {char for char in "hello world"}
print(unique_chars)
A = [1, 2, 3]
B = [4, 5, 6]
product_set = {a * b for a in A for b in B}
print(product_set)