본문 바로가기
Python

[Python] set and frozenset

by ds31x 2023. 7. 12.

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이 바로 setfrozenset 클래스임 (이 둘의 차이는 mutable여부임)

  • 단, 무한 개의 element를 가지는 수학적 집합에 해당하는 클래스는 없음.

Programming에서
frozen 이라는 용어는
값의 변경이 이루어지않도록 고정된 경우를
가르키는 경우가 많음 .

수학적 집합을 다루기 위한 용도 외에 set이 활용되는 경우는 다음과 같음.

  • 특정 collection에서 중복되는 item을 제거.
  • in membership 연산이 set에서 매우 빠름.

엄밀하게 애기하면 setfrozeset은 distinct element들로 구성된 collection임.


생성

Python에서 setdict와 함께 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

 

py_set_frozenset.ipynb

py_set_frozenset.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com