개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 10. 자료형 분류와 set & frozenset 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 10. 자료형 분류와 set & frozenset

hayongwoon 2022. 4. 29. 17:47

1. 자료형 분류

파이썬이 제공하는 다음과 같은 자료형들을 가리켜 '시퀀스 타입(sequence type)'이라 한다. 문자열의 경우 텍스트 시퀀스 타입이라 하는데, 이것도 뭐 시퀀스 타입의 일종이다.

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

이들에겐 저장된 값의 순서 정보(위치 정보)가 존재하다는 특징이 있다. 레인지의 경우에는 시작과 끝값의 범위를 저장하지만 시작과 끝이라는 순서가 존재한다. 여튼 저장된 값의 순서가 존재한다는 것이 시퀀스(연속적인)타입의 특징이다. 다음 두 연산은 시퀀스 타입의 특징을 기반으로 진행되는 연산이다.

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

그리고 딕셔너리 자료형의 경우 '매핑 타입(mapping type)'이라 한다.

  • 딕셔너리              dict 클래스

딕셔너리와 같은 매핑타입은 저장된 값의 위치 정보나 순서따위를 고려하지 않는 자료형이다. 물론 버전 3.7부터는 순서를 유지하기 시작했으나 본질이 바뀌진 않는다. 따라서 딕셔너리는 슬라이싱이나 인덱싱 연산이 되지 않는다.

 

마지막으로 다음 두 자료형을 가리켜 '셋 타입(set: 집합)'이라 한다.

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

수학의 집합을 표현한 자료형이다! 기본적으로 두가지 특징이 있다.

1) 수학의 집합은 저장 순서를 고려하지 않는다.

2) 수학의 집합은 중복값을 허용하지 않는다.

 

시퀀스 타입, 매핑 타입, 셋 타입! 이 세가지를 가볍게 알아봤는데, 이름만 들어보면 어느정도 유추가 가능하다! 연속적인 타입, 매핑(연결) 타입, 집합 타입. 이번에는 집합 타입에 대해 자세히 다뤄보자!

 

2. set & frozenset

두 집합을 대상으로 하는 수학의 기본적인 연산

  • 합집합                두집합의 모든 원소들을 합한 집합
  • 차집합                한 집합을 기준으로 다른 집합을 뺀, 다시 말해 교집합 부분을 제외한 나머지 값들
  • 교집합                두 집합이 공통으로 갖고있는 원소들의 집합
  • 대칭 차집합        두 집합의 합집합에서 교집합 부분만 뺀 집합

위 네가지 연산을 셋 객체의 적용하는 예는 다음과 같다!

셋 객체 연산 예

추가로 in, not in 연산도 가능하고 반환되는 객체도 iterable 객체이므로 for loop 구성도 가능하다!

그리고 셋을 생성할 때 {}와 같이 딕셔너리와 같은 중괄호를 사용해서 만들지만 키, 벨류로 구분지어 만드는 것이 아니면 즉 원소 형태로 값을 저장하면 이는 셋 타입 객체이다.

셋 객체를 생성하는 법은 {} 또는 set()를 만들어 사용한다.

 

 이 모든 내용이 frozenset에도 동일하게 적용이 된다. 그렇다면 둘의 차이는 무엇인가.

단 한가지의 차이점이 있는데, set은mutable 객체이고 frozenset은 immutable 객체이다. 이름만 보면 대충 감이 온다! frozen 얼려있는 함수이니까! 변할 수 없겠구나! 하고 참 이름을 잘 지은 것 같다.

 

그렇다면 set은 어떻게 값을 수정할 수 있을까...

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

외우는 것은 무리이니 나중에 블로그를 보고 참고해서 사용하면 좋겠다.

 

마지막으로 set도 iterable 객체이니 컴프리헨션이 가능하다! 물론 반환되는 값은 루프의 순서와 상관이 없이 저장이 된다는 것은 알아두자!