set & frozenset
set
(집합) : 특정 conditions를 만족시키는 구별 가능한(distinct) object의 collection.
set
의 중요한 수학적 특징은
- 특정 object가
set
에 속하는지 아닌지를 명확히 판별(특정 conditions에 의해)할 수 있음. set
에 속한 object들은 element(원소)라고 부르고 이들 간은 구별 가능해야함
(동일한 object를 2개가 set에 속할 수 없음)
참고: 수학에서의 set https://dsaint31.tistory.com/679#Set%-A
이같은 특성 때문에,
- set에서 element간에는 특정한 order가 없고,
- 동일한 element(구별이 불가능한)가 2개 이상이 set에 속할 수 없다.
Python에서 이 수학적 set에 대응하는 collection이 바로 set과 frozenset 클래스임 (이 둘의 차이는 mutable여부임)
- 단, 무한 개의 element를 가지는 수학적 집합에 해당하는 클래스는 없음.
Programming에서
frozen 이라는 용어는
값의 변경이 이루어지않도록 고정된 경우를
가르키는 경우가 많음 .
수학적 집합을 다루기 위한 용도 외에 set
이 활용되는 경우는 다음과 같음.
- 특정 collection에서 중복되는 item을 제거.
in
membership 연산이 set에서 매우 빠름.
엄밀하게 애기하면 set
과 frozeset
은 distinct element들로 구성된 collection임.
생성
Python에서 set
은 dict
와 함께 curly bracket {
,}
을 사용한다.
# ---------------------
a = {}
print(f'{type(a)=}')
# type(a)=<class 'dict'>
# ---------------------
b = set()
print(f'{type(b)=}')
# type(b)=<class 'set'>
# ---------------------
c = { 3, 4, 3, 2}
print(f'{c=}')
# c={2, 3, 4}
dict와 set의 구분은 내부에서 colon :
을 이용한 key-value item인지, 그냥 value로 구성된 itme인지로 이루어짐
- 단, empty set은
set()
을 이용해야한다. a={}
인 경우a
는 dictionary임.
frozeset은 다음과 같이 생성됨 : 생성시 인자로 iterable을 요구함.
fset = frozenset([1,2,3])
print(fset)
fset = frozenset(set([1,2,3]))
print(fset)
Operations and Methods for "set" and "frozenset"
A = {1,2,3}
B = {2,3,4,5}
print(A|B) # A.union(B) or B.union(A)
- union (합집합)
- \( A \cup B \)
A = {1,2,3}
B = {2,3,4,5}
print(A-B) # A.difference(B)
- difference (차집합)
- \(A - B\)
A = {1,2,3}
B = {2,3,4,5}
print(A&B) # A.intersection(B)
- intersection (교집합)
- \(A \cap B\)
A = {1,2,3}
B = {2,3,4,5}
print(A^B) # A.symmetric_difference(B)
- symmetric difference (대칭차집합)
- \((A-B) \cup(B-A)\)
A = {1,2,3}
B = {2,3,4,5}
print(A <= B) # A.issubset(B)
print(A < B) # 진부분집합인지 여부
print(A >=B) # A.issuperset(B)
print(A > B) # 진 superset 여부.
- 집합 간의 포함여부.
A = {1,2,3}
B = {2,3,4,5}
A.isdisjoint(B)
- 두 집합이 공통으로 가지고 있는 element가 없는지 여부 (없으면, True)
A = {1,2,3}
C = A.copy()
- A의 복사본으로 새로운 object를 만들어냄.
empty_set = set() # empty_dic = {} 임을 명심할 것.
- 공집합(null set or empty set)의 생성은
set()
을 사용함.
Operations and Methods for set
A = {1,2,3}
A.add(4) # add 4. 중복되는 element추가시 무시됨.
print(A) # {1, 2, 3, 4}
A.remove(4) # argument에 해당하는 element 삭제. 해당 element가 없을시 에러 발생.
print(A) # {1, 2, 3}
A.discard(4) # argument에 해당하는 element 삭제. 해당 element가 없을시 무시
print(A) # {1, 2, 3}
c = A.pop() # 임의의 element를 반환하고, 해당 element를 set에서 삭제
print(A) # {2, 3}
A.clear() # element들을 모두 삭제.
print(A) # set()
- 위의 메서드들은 대상 object를 변경시키기 때문에
- immutable인
frozenset
에선 사용불가
A = {1,2,3}
B = {2,3,4,5}
A |= B # A.update(B)
A &= B # A.intersection_update(B)
A -= B # A.difference_update(B)
A ^= B # A.symmetric_difference_update(B)
- \(A\cup B\)으로
A
를 갱신. - \(A\cap B\)으로
A
를 갱신. - \(A - B\)으로
A
를 갱신. - \((A-B) \cup (B-A)\)으로
A
를 갱신. - 대상 object를 변경시키기 때문에 immutable인
frozenset
에선 사용불가
관련 ipynb.
https://gist.github.com/dsaint31x/293248e51ff257825d6c1eafe9589a04
'Python' 카테고리의 다른 글
[Python] special methods and operator overloading (0) | 2023.07.13 |
---|---|
[Python] list (sequence type) : summary (0) | 2023.07.12 |
[Python] dictionary (Mapping type) : basic (0) | 2023.07.11 |
[Python] Dictionary's methods (0) | 2023.07.11 |
[Python] 특정 점에서 직선에 수선의 발 구하기. (0) | 2023.07.11 |