set()은 중복을 허용하지 않고 순서가 없는 자료구조이다. 수학적 집합과 유사하며, 중복 제거, 교집합/합집합 연산, 원소 존재 여부 확인 등에 유용하게 사용할 수 있다.
# 중괄호 {} 사용
my_set = {1, 2, 3, 4, 5}
print(my_set) # {1, 2, 3, 4, 5}
# set() 함수 사용
my_set = set([1, 2, 3, 3, 4, 5]) # 리스트에서 중복 제거
print(my_set) # {1, 2, 3, 4, 5}
# 문자열을 set()으로 변환
char_set = set("hello")
print(char_set) # {'e', 'h', 'l', 'o'}
set()에서만 사용할 수 있는 연산으로 한 개의 원소 추가하기 add(), 여러 개의 원소 추가하기 update(), 한 개의 원소 삭제하기 discard()가 있다.
my_set = {1, 2, 3}
my_list = [1, 2, 3]
# add(): 원소추가
my_set.add(4)
print(my_set) # {1, 2, 3, 4}
my_list.add(4)
print(my_list) # AttributeError: 리스트에서는 set 연산 불가
# update(): 여러 원소 추가
my_set.update([5, 6, 7])
print(my_set) # {1, 2, 3, 4, 5, 6, 7}
my_list.update([5, 6, 7])
print(my_list) # AttributeError: 리스트에서는 update 연산 불가
# remove(), discard(), pop(): 원소 삭제
my_set = {1, 2, 3, 4, 5}
my_set.remove(3) # 3 삭제 (없으면 KeyError 발생)
my_set.discard(4) # 4 삭제 (없어도 에러 X)
my_set.pop() # 임의의 원소 삭제 (순서 없어서 랜덤 삭제)
print(my_set) # {2, 5, 1} 중 2개가 랜덤으로 출력
my_list.discard(3)
print(my_list) # AttributeError: 리스트에서는 discard 연산 불가
# clear(): 모든 원소 삭제
my_set.clear()
print(my_set) # set()
A = {1, 2, 3}
B = {3, 4, 5}
# 합집합: | 또는 union()
print(A | B) # {1, 2, 3, 4, 5}
print(A.union(B)) # {1, 2, 3, 4, 5}
# 교집합: & 또는 intersection()
print(A & B) # {3}
print(A.intersection(B)) # {3}
# 차집합: - 또는 difference()
print(A - B) # {1, 2} (A에서 B에 포함된 요소 제거)
print(A.difference(B)) # {1, 2}
# 대칭차집합: ^ 또는 symmetric_difference()
print(A ^ B) # {1, 2, 4, 5} (A와 B 중 겹치지 않는 요소)
print(A.symmetric_difference(B)) # {1, 2, 4, 5}
# 리스트에서 중복 제거
nums = [1, 2, 2, 3, 4, 4, 5]
unique_nums = list(set(nums))
print(unique_nums) # [1, 2, 3, 4, 5]
# 특정 원소 존재 여부 확인
my_set = {1, 2, 3, 4, 5}
print(3 in my_set) # True
print(6 in my_set) # False
# 두 리스트에서 공통 요소 찾기
list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
common = set(list1) & set(list2)
print(common) # {3, 4, 5}
# 여러 개의 집합 연산
sets = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
common_elements = set.intersection(*sets) # 모든 집합의 교집합
print(common_elements) # {3}