집합(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

+ Recent posts