본문 바로가기

python

set과 frozenset

파이썬이 제공하는 다음과 같은 자료형들을 가리켜 ‘시퀀스 타입(sequence type)’이라 한다.

  • 리스트 : list 클래스의 객체
  • 튜플 : tuple 클래스의 객체
  • 레인지 : range 클래스의 객체
  • 문자열 : str 클래스의 객체

 

이들에겐 저장된 값의 순서 정보가 존재한다는 특징이 있다.

 

다음 자료형을 가리켜 ‘매핑 타입(mapping type)’이라 한다.

  • 딕셔너리 : dict 클래스의 객체

 

매핑 타입은 본직적으로 저장된 값의 순서 또는 위치 정보를 기록하지 않는 자료형이다. 파이썬 3.7부터 저장된 값의 순서를 유지하기 시작했으나 그렇다고 본질이 바뀌지는 않는다. 때문에 이를 대상으로는 인덱싱이나 슬라이싱 연산이 불가능하다.

 

다음 두 자료형을 가리켜 ‘셋 타입(set type)’이라 한다.

  • 셋 : set 클래스의 객체
  • 프로즌 셋 : frozenset 클래스의 객체

 

셋 타입은 그 이름대로 수학의 집합을 표현한 자료형이다. 셋과 프로즌 셋은 저장된 값의 순서 정보가 존재하지 않고, 중복된 값의 저장도 허용하지 않는다.

두 집합을 대상으로 하는 수학의 기본 연산들은 다음과 같다.

 

  • 합집합 : 두 집합의 모든 원소들을 합한 집합
  • 차집합 : 한 집합에서 다른 한 집합이 갖는 원소들을 뺀 집합
  • 교집합 : 두 집합에 공통으로 존재하는 원소들의 집합
  • 대칭 차집합 : 두 집합의 합집합에서 교집합을 뺀 집합
# set을 이용한 연산

A = {'a', 'c', 'd', 'f'}
B = {'a', 'b', 'd', 'e'}

A - B       # A에 대한 B의 차집합
=> {'c', 'f'}

A & B      # A에 대한 B의 교집합
=> {'d', 'a'}

A | B      # A에 대한 B의 합집합
=> {'e', 'f', 'd', 'a', 'b', 'c'}

A ^ B      # A에 대한 B의 대칭 차집합
=> {'e', 'f', 'b', 'c'}

 

# set

A = {'a', 'b', 'c', 'd'}
B = set('bacd')

A == B      # 저장 순서는 상관없이 내용물만 같으면 True
=> True

'a' in A    # 집합 A에 원소 'a'가 있는지?
=> True

set의 경우 저장 순서는 상관없고 내용물만 같으면 두 객체가 같다고 판단한다.

 

하지만 frozenset은 다르다.

 

# frozenset

A = frozenset(['a', 'b', 'c', 'd'])    # frozenset 함수에 iterable 객체 전달해서 생성
B = frozenset(['d', 'c', 'b', 'a'])

A == B
=> False

'a' in A
=> True

set과 사용 방법은 같지만 A과 B의 객체를 비교했을 때 내용물은 같지만 순서가 달라서 다르다고 판단한다.

 

 

set과 frozenset의 차이

실제로 이 둘은 큰 차이가 없다. 다만 한 가지 차이점이 있다.

  • set : mutable 객체
  • frozenset : immutable 객체

 

set은 새로운 값의 추가 또는 삭제가 가능한 반면 frozenset은 불가능하다. 그래서 다음과 같이 기존에 존재하던 객체의 값을 수정하는 연산은 set을 대상으로만 할 수 있다.

  • add : 원소 추가하기
  • discard : 원소 삭제하기
  • update( |= ) : 다른 집합의 원소 전부 추가하기
  • intersection_update( &= ) : 다른 집합과 공통으로 있는 원소만 남기기
  • difference_update( -= ) : 다른 집합이 갖는 원소 모두 삭제하기
  • symmetric_difference_update( ^= ) : 공통으로 갖지 않는 것들을 추가하고 나머지는 삭제

 

os = {1, 2, 3, 4, 5}

os.add(6)
=> {1, 2, 3, 4, 5, 6}

os.discard(1)
=> {2, 3, 4, 5, 6}

os.update({7, 8, 9})
=> {2, 3, 4, 5, 6, 7, 8, 9}

os &= {2, 4, 6, 8}   # 집합 os에서 {2, 4, 6, 8}과 겹치는 원소만 남김
=> {8, 2, 4, 6}

os -= {2, 4}         # 집합 os에서 {2, 4}의 원소를 모두 삭제
=> {6, 8}

os ^= {1, 3, 6}       # 집합 os에서 {1, 3, 6}에 있는 원소는 삭제하고 없는 원소는 추가
=> {1, 3, 8

'python' 카테고리의 다른 글

python 네이버 금융 웹 스크래핑  (0) 2022.05.14
파이썬 웹 스크래핑  (0) 2022.05.14
dict & defaultdict  (0) 2022.04.06
파이썬의 메모리 관리  (0) 2022.04.06
제너레이터 함수  (0) 2022.03.06