[Python] 자료형분류와 set & frozenset

2 분 소요

자료형 분류

1. 시퀀스 타입(sequence type)

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

이들에게는 저장된 값의 순서 정보(위치정보)가 존재한다는 특징이 있다. 즉 저장된 값의 순서 정보가 존재하는 것이 시퀀스 타입의 가장 큰 특징이다.

  • 인덱싱 연산 : 특정 값 하나를 참조하는 연산 ex) s[0], s[1]
  • 슬라이싱 연산 : 시작과 끝을 정하여 이를 참조하는 연산 ex) s[0:3], s[5:9]

시퀀스타입은 다음 두가지 연산이 가능하다. 인덱싱 연산과 슬라이싱 연산은 저장된 값의 순서 정보를 기반으로 진행되는 연산이기 때문이다.

2. 매핑 타입(mapping type)

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

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

3. 셋 타입(set type)

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

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

set, frozenset

>>> A = {'a','c','d','f'}
>>> B = {'a','b','d','e'}
>>> A - B
{'c','f'}
>>> A & B
{'d','a'}
>>> A | B
{'e','f','d','a','b','c'}
>>> A ^ B
{'e','f','b','c'}

집합은 합집합, 차집합, 교집합, 대칭 차집합 연산이 가능하다.

>>> A = set(['a','c','d','f'])
>>> B = set('fdca')
>>> A == B  # 저장 순서는 상관없이 내용물만 같으면 True
True
>>> 'a' in A
True
>>> 'b' not in A
True
>>> for c in A&B:
        print(c, end=' ')

d c f a

set역시 iterable 객체이기 때문에 for 루프의 구성도 가능하다.

>>> d = {}
>>> type(d)
<class 'dict'>
>>> s= set()
>>> type(s)
<class 'set'>

set은 딕셔너리와 마찬가지로 {}안에 값을 저장한다. set 생성방법은 위 코드와 같다.

>>> A = frozenset(['a','c','d','f']) # frozenset 함수에 iterable 객체 전달해 생성
>>> B = frozenset(['a','b','d','e'])
>>> A - B
frozenset({'c','f'})
>>> A | B
frozenset({'e','f','d','a','b','c'})
>>> A == B
False
>>> 'a' in A
True
>>> for c in A&B:
        print(c, end=' ')

d a
>>> t = [3,3,3,7,7,'z','z']
>>> t = list(set(t))
>>> t
[3,'z',7]

위 예제는 리스트에 저장된 값들 중 중복된 값들을 하나만 남기고 삭제하는 방법을 보여준다. 이는 값의 중복을 허용하지 않는 set의 특성을 활용한 결과이다. 물론 위 코드에서도 set뿐 아니라 frozenset으로도 구현 가능하다.



set 변경 가능, frozenset 변경 불가

set과 frozenset의 큰 차이는 없다. set은 mutable 객체이고, frozenset은 immutable객체이다.

set은 다음과 같은 연산이 가능하다.

  • add : 원소 추가
  • discard : 원소 삭제
  • update, = : 다른 집합의 원소 전부 추가하기
  • intersection_update, &= : 다른 집합과 공통으로 있는 원소만 남기기
  • difference_update, -= : 다른 집합이 갖는 원소 모두 삭제하기
  • symmetric_difference_update, ^= : 공통으로 갖지 않는 것들은 추가하고 나머지는 삭제
>>> os = {1,2,3,4,5}
>>> os.add(6)
>>> os.discard(1)
>>> os
{2,3,4,5,6}
>>> os.update({7,8,9})
>>> os
{2,3,4,5,6,7,8,9}
>>> os &= {2,4,6,8}
>>> os
{8,2,4,6}
>>> os -= {2,4}
>>> os
{6,8}
>>> os ^= {1,3,6}
>>> os
{1,3,8}



set 컴프리헨션

>>> s1 = {x for x in range(1,11)}
>>> s1
{1,2,3,4,5,6,7,8,9,10}
>>> s2 = {x for x in range(1,11) if x<5}
>>> s2
{1,2,3,4}

리스트 대상 컴프리헨션의 적용방법은 set에도 그대로 사용할 수 있다.