집합(Set)은 순서가 없고(non-sequence) 변경 가능(mutable)하며 중복을 허용하지 않는 자료구조이다.
집합의 원소로 다양한 타입의 데이터가 사용될 수 있지만 mutable한 데이터는 사용 불가능하다.
주로 멤버십(집합과 원소의 포함 관계) 검사나 데이터의 중복의 제거, 합집합, 교집합, 차집합 등의 집합 간 연산을 활용하기 위한 용도로 사용된다.
선언
my_set1 = {1, 2, 3, 4, 5}
my_set2 = set([1, 2, 3])
my_set3 = set('hello')
print(my_set1) # 실행결과: {1, 2, 3, 4, 5}
print(my_set2) # 실행결과: {1, 2, 3}
print(my_set3) # 실행결과: {'l', 'h', 'o', 'e'}
집합의 선언은 중괄호 안에 직접 원소를 명시하는 방식과 set 메소드를 호출하는 방식이 있다.
set 메소드의 인자로는 iterable한 인스턴스가 올 수 있으며 집합이 생성되는 과정에서 중복은 제거되며
순서는 유지되지 않는다. 이러한 성질을 활용하여 중복 데이터를 제거하기 위해 집합을 활용하기도 한다.
삽입
1. add 메소드
my_set = {1, 2, 3, 4, 5}
my_set.add(6)
print(my_set) # 실행결과: {1, 2, 3, 4, 5, 6}
집합에 하나의 값을 추가한다.
2. update 메소드
my_set = {1, 2, 3, 4, 5}
my_set.update([5, 6, 7])
print(my_set) # 실행결과: {1, 2, 3, 4, 5, 6, 7}
집합에 여러개의 값을 추가한다. 이 과정에서 중복데이터는 제거된다.
삭제
1. remove 메소드
my_set = {1, 2, 3, 4, 5}
my_set.remove(3)
print(my_set) # 실행결과: {1, 2, 4, 5}
my_set.remove(3) # 실행결과: KeyError 발생
인자로 넘겨준 값을 삭제한다. 제거하려는 데이터가 존재하지 않는 경우 KeyError를 발생시킨다
2. discard 메소드
my_set = {1, 2, 3, 4, 5}
my_set.discard(3)
print(my_set) # 실행결과: {1, 2, 4, 5}
my_set.discard(3)
print(my_set) # 실행결과: {1, 2, 4, 5}
remove와 동일하게 인자로 넘겨준 값을 삭제한다. remove와 달리 제거하려는 데이터가 존재하지 않아도 에러를
발생시키지 않는다.
집합연산
my_set1 = {1, 2, 3, 4, 5}
my_set2 = {4, 5, 6, 7, 8}
# 합집합
uni_set1 = my_set1 | my_set2
uni_set2 = my_set1.union(my_set2)
print(uni_set1) # 실행결과: {1, 2, 3, 4, 5, 6, 7, 8}
print(uni_set2) # 실행결과: {1, 2, 3, 4, 5, 6, 7, 8}
# 차집합
dif_set1 = my_set1 - my_set2
dif_set2 = my_set1.difference(my_set2)
print(dif_set1) # 실행결과: {1, 2, 3}
print(dif_set2) # 실행결과: {1, 2, 3}
# 교집합
int_set1 = my_set1 & my_set2
int_set2 = my_set1.intersection(my_set2)
print(int_set1) # 실행결과: {4, 5}
print(int_set2) # 실행결과: {4, 5}
# 대칭차집합 (합집합 - 교집합)
sym_set1 = my_set1 ^ my_set2
sym_set2 = my_set1.symmetric_difference(my_set2)
print(sym_set1) # 실행결과: {1, 2, 3, 6, 7, 8}
print(sym_set2) # 실행결과: {1, 2, 3, 6, 7, 8}
집합 연산에는 연산자를 사용한 방식과 연산을 위한 set의 내장메소드를 사용하는 방법이 있다.
합집합 연산 : 연산자 | 또는 내장메소드 union
차집합 연산 : 연산자 - 또는 내장메소드 difference
교집합 연산 : 연산자 & 또는 내장메소드 intersection
대칭차집합 연산 : 연산자 ^ 또는 내장메소드 symmetric_difference
포함관계
my_set1 = {1, 2, 3, 4, 5}
my_set2 = {3, 4, 5}
my_set3 = {6, 7, 8}
# 부분집합 여부 (a.issubset(b) : a가 b의 부분집합일 경우 True, 아닐경우 False)
print(my_set1.issubset(my_set2)) # 실행결과: False
print(my_set2.issubset(my_set1)) # 실행결과: True
# 상위집합 여부 (a.issuperset(b) : a가 b를 포함할 경우 True, 아닐경우 False)
print(my_set2.issuperset(my_set1)) # 실행결과: False
print(my_set1.issuperset(my_set2)) # 실행결과: True
# 교집합 유무 (a.isdisjoint(b) : a와 b의 교집합이 없을 경우 True, 아닐경우 False)
print(my_set1.isdisjoint(my_set2)) # 실행결과: False
print(my_set1.isdisjoint(my_set3)) # 실행결과: True
집합간의 포함관계를 확인하기 위한 내장 메소드로 issubset, issuperset, isdisjoint 가 있다.
복사의 경우 다른 자료구조들과 마찬가지로 내장된 copy메소드를 호출하여 얕은 복사본을 만들 수 있다.
집합의 경우 그 원소로 immutable한 값만이 올 수 있기에 깊은복사는 의미가 없다.
'언어 > Python' 카테고리의 다른 글
| #7 데크(deque) (0) | 2021.04.05 |
|---|---|
| #6 재귀 제한(recursion limit) (0) | 2021.04.05 |
| #4 딕셔너리(Dictionary) (0) | 2021.02.25 |
| #3 튜플(Tuple) (0) | 2021.02.24 |
| #2 리스트(List) (0) | 2021.02.24 |