집합 자료형(set),
집합 자료형은, 다른 프로그래밍 언어에선 보기 힘든 독특한 파이썬의 자료형입니다.
2020/02/08 - [파이썬/문법] - 파이썬의 자료형 종류
위의 예전 글을 참조해보면, 좀 성질도 독특한 자료형임을 알 수 있는데요. 간단하게 수학의 집합을 떠올리면 좋겠습니다.
집합자료형(set)은 수학의 집합처럼 요소의 중복이 안되고, 순서도 정해져있지 않습니다.
리스트는 []로, 문자열은 ''또는 ""로 묶듯이, 집합자료형은 {}로 묶습니다.
그리고 집합자료형의 생성때 요소가 중복되는 값을 넣어도 하나만 들어갑니다. (중복이 자동으로 생략됩니다.)
s1 = {1, 2, 1}
s2 = {}
s3 = set([1, 2, 3])
s4 = set()
s5 = set('ppap')
print(s1, s2, s3, s4, s5)
print(type(s1), type(s2), type(s3), type(s4), type(s5))
# 여기중에 스파이가 껴있다. 바로 s2(얘는 딕셔너리자료형이다.)
set() 함수로 다른 군집자료형(리스트,문자열등)을 집합자료형으로 변환할 수 있습니다. (예제에선 숫자만 썼지만, 문자도 가능합니다.)
참고로 빈 집합자료형을 생성할 때 { }와 같이 하면, 빈 딕셔너리(dic) 자료형으로 선언됩니다...
왜냐하면 딕셔너리자료형도 집합자료형과 같이 {}를 사용하기 때문인데요.
그래서 따로 집합자료형의 빈 상태를 만들려면 set()으로 선언해야됩니다.
집합 자료형의 성질은 순서가 없기에, 인덱싱과 슬라이싱은 할수 없습니다.(다른 자료형으로 변환후 사용할 수 밖에...)
frozenset(읽기전용 집합 자료형),
fs1 = frozenset([1, 2, 3])
fs2 = frozenset(s1)
print(fs1, type(fs1)) # 출력결과 : frozenset({1, 2, 3}) <class 'frozenset'>
print(fs2, type(fs2)) # 출력결과 : frozenset({1, 2}) <class 'frozenset'>
frozenset은 집합중 읽기전용 집합으로, 집합자료형(set)과 성질이 똑같지만,
frozenset()함수로 선언할 수 있고, 읽기전용이기에 요소의 수정, 삭제가 불가능합니다.
그 이외에는 set자료형과 같게 사용할 수 있습니다.
집합 연산
s01 = {1, 2}
s02 = {2, 3}
print(s01 & s02, s01 | s02, s01 - s02, s01 ^ s02)
집합자료형답게 교집합(&)(논리곱, and연산), 합집합(|)(논리합, or연산), 차집합(-) 연산을 할 수 있습니다.
(&, | 같은 비트연산자를 활용하는데, and, or같은 논리연산자는 쓸수 없습니다.)
그리고, 대칭차집합 연산(^)(합집합 - 교집합), 두집합에서 안겹치는 것들의 집합도 구할 수 있습니다.
집합 함수
s01 = {1, 2}
s02 = {2, 3}
print(s01.intersection(s02)) #교집합
print(s01.union(s02)) #차집합
print(s01.difference(s02)) #여집합
print(s01.symmetric_difference(s02)) #대칭차집합
집합자료형도 다른자료형처럼 내장함수, 메쏘드를 가집니다.
(len() 내장함수는 집합 자료형에서도 사용가능하며, 마찬가지로 요소의 개수를 반환합니다.)
앞써 나왔던 집합 연산도 함수로 사용할 수 있는데, 각각
.intersection() : 교집합 함수
.union() : 합집합 함수
<빼기전집합>.difference(<빼는집합>) : 차집합 함수
.symmetric_difference() : 대칭차집합 함수
를 사용해서 집합연산을 할 수 있습니다.
그외의 집합자료형 메쏘드는...
요소 추가, 삭제 메쏘드
: 요소 추가, 삭제에 속하는 메쏘드는 frozenset 자료형에선 요소의 추가, 삭제가 불가능 하기에 사용할 수 없습니다.(쓰면 에러가 납니다.)
.add() 함수
temp_s = {1, 2, 3}
temp_s.add(4)
print(temp_s) # 출력결과 : {1, 2, 3, 4}
인자값으로 요소 한개를 전달받아 집합에 추가합니다.
.update() 함수
temp_s = {1, 2, 3}
temp_s.update([4, 5, 6])
print(temp_s) # 출력결과 : {1, 2, 3, 4, 5, 6}
인자값으로 요소 여러개를 전달받아 집합에 추가합니다.
.remove() 함수
temp_s = {1, 2, 3}
temp_s.remove(3)
print(temp_s) # 출력결과 : {1, 2}
인자값과 같은 요소를 집합에서 삭제합니다.
여기서 생략된 .discard()함수도 똑같은 일을 수행하는데,
차이점은 remove()는 삭제할 요소가 없으면 에러를 발생시키고 discard()는 None을 반환합니다.
.pop() 함수, .clear() 함수
temp_s = {1, 2, 3}
temp_s.pop()
print(temp_s) # 출력결과 : (무작위 요소 하나가 제거된 temp_s)
temp_s.clear()
print(temp_s) # 출력결과 : set() (=빈 집합)
.pop() : 집합에서 (임의의)무작위 요소를 삭제합니다. (빈 집합일 경우 에러나요)
.clear() : 집합을 빈집합으로 초기화 시킵니다. (=집합의 모든 요소를 제거합니다.)
집합 판별 메쏘드
.issubset() 함수
a = {1, 2, 3}
b = {1, 2}
print(a.issubset(b)) # == a <= b (<=연산자를 사용하셔도 됩니다.)
함수의 대상이 되는 (.앞의)집합을 기준으로, 인자값(함수괄호안)의집합이 기준에 대해 부분집합인지 참 거짓으로 반환
(인자값집합 ⊂ 기준집합)
(위의 예제에선, b ⊂ a)
.issuperset() 함수
a = {1, 2, 3}
b = {1, 2}
print(a.issuperset(b)) # == b <= a (<=연산자를 사용하셔도 됩니다.)
인자값의 집합을 기준으로, 대상이 되는 집합이 기준에 대해 부분집합인지 참 거짓으로 반환
(기준집합 ⊂ 인자값집합)
(위의 예제에선, a ⊂ b)
(따라서 a.issubset(b) 와 b.issuperset(a) 는 같은 표현입니다.)
.isdisjoint() 함수
a = {1, 2, 3}
b = {1, 2}
print(a.isdisjoint(b))
두 집합에서 교집합이(겹치는 요소가) 없는지 참 거짓으로 반환
이렇게 집합에 대해 알아봤는데, 정말로 수학의 집합 정의를 그대로 자료형에 가져온 느낌입니다. 그렇기에 좀 어렵기도 한 자료형이 아닐까? 싶습니다.
특이하게도 frozenset이라는 set부류의 자료형도 겸사겸사 알아봤는데, 요소수정이불가한 읽기전용집합이라 기억하면 될것 같습니다.
'파이썬(Python) > 문법' 카테고리의 다른 글
자료형 - 4-2. 리스트 함수 (0) | 2020.03.25 |
---|---|
자료형 - 4-1. 리스트자료형 (0) | 2020.03.25 |
자료형 - 3-5. 문자열 포맷팅 심화, 형식 지정자 (1) | 2020.03.11 |
자료형 - 3-4. 문자열 포맷팅 (0) | 2020.03.10 |
자료형 - 3-3. 문자열 함수 (0) | 2020.03.06 |