데이터 구조체

YangJiWon·2020년 8월 10일
0

python

목록 보기
6/12

전문가를 위한 파이썬을 정리한 내용입니다.

시퀀스(Sequence)

컨테이너 시퀀스

  • 서로 다른 자료형의 항목들을 담을 수 있는 list, tuple, collections.deque 형

균일 시권스

  • 단 하나의 자료형만 담을 수 있는 str, bytes, bytearray, memoryview, array.array 형
  • 균일 시퀀스가 컨테이너 시퀀스보다 메모리를 더 적게 사용합니다. 대신 기본적인 자료형만 저장할 수 있습니다.(문자, 바이트, 숫자 등)

가변 시퀀스

  • list, bytearray, array.array, collections.deque, memoryview 형

불변 시퀀스

  • tuple, str, bytes 등

제너레이터 표현식

  • 튜플, 배열 등의 시퀀스형을 초기화하려면 list comprehension을 사용할 수도 있지만, 다른 생성자에 전달할 리스트를 통째로 만들지 않고 반복자 프로토콜을 이용해서 항목을 하나씩 생성하는 제너레이터 표현식은 메모리를 더 적게 사용합니다.
>>> symbols = "$%^%@#"
>>> tuple(ord(symbol) for symbol in symbols)
>>> array.array('I', (ord(symbol) for symbol in symbols))
>>> color = ['black', 'white']
>>> sizes = ['S', 'M', 'L']
>>> for tshirt in ('%s %s' % (c, s) for c in colors for s in sizes):
	print(tshirt)
  • 제너레이터 표현식은 한 번에 하나의 항목을 생성하므로 메모리가 절약됩니다.
  • list comprehension으로 사용했을 때는 6개의 종류를 담고 있는 리스트를 만듭니다.

* 언패킹

  • 함수 매개변수에 *를 연결해서 초과된 인수를 가져오는 방법은 파이썬의 고전적인 기능입니다.
  • 파이썬 3에서는 이 개념을 확장해서 다음과 같이 병렬 할당에도 적용할 수 있습니다.
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
>>> a, b, *rest = range(3)
>>> a, b, rest
(0, 1, [2])
>>> a, b, *rest = range(2)
>>> a, b, rest
(0, 1, [])

병렬 할당의 경우 *는 단 하나의 변수에만 적용할 수 있습니다. 하지만 다음과 같이 어떠한 변수에도 적용할 수 있습니다.

>>> a, *body, c, d = range(5)
>>> a, body, c, d
(0, [1, 2], 3, 4)
>>> *head, b, c, d = range(5)
>>> head, b, c, d
([0, 1], 2, 3, 4)

namedtuple()

  • collections.namedtuple() 함수는 필드명과 클래스명을 추가한 튜플의 서브클래스를 생성하는 팩토리 함수로서, 디버깅할 때 유용합니다.
  • 필드명이 클래스에 저장되므로 namedtuple()로 생성한 객체는 튜플과 동일한 크기의 메모리만 사용합니다. 속성을 객체마다 존재하는 __dict__에 저장하지 않으므로 일반적인 객체보다 메모리를 적게 사용합니다.
# 일반적인 namedtuple 정의 방법
Card = collections.namedtuple('Card', ['rank', 'suit'])
>>> City = namedtuple('City', 'name country population coordinates')
>>> seoul = City('Seoul', 'KR', 36.933, (35.45596, 138.1223124))
>>> seoul
City(name='Seoul', country='KR', population=36.933, coordinates=(35.45596, 138.1223124))
>>> seoul.population
36.933
>>> seoul.name
'Seoul'
>>> seoul[1]
'KR'

_make(), _asdict()

  1. _make(iterable) 클래스 메서드
    _make()는 반복형 객체로부터 namedtuple을 만듭니다.
  2. _asdict()는 namedtuple 객체에서 collections.OrderedDict 객체로 반환합니다.

슬라이싱

  • 파이썬에서 제공하는 list, tuple, str. 그리고 모든 시퀀스형은 슬라이싱연산을 지원합니다.

슬라이스와 범위 지정시에 마지막 항목이 포함되지 않는 이유

  • 슬라이스와 범위 지정시에 마지막 항목을 포함하지 않는 관례는 인덱스 번호가 0번부터 시작하는 파이썬, C 등의 언어에서 잘 동작합니다.
  • 이와 같은 관례로 다음과 같은 장점들이 있습니다.
  1. 세 개의 항목을 생성하는 range(3)나 my_list[:3]처럼 중단점만 이용해서 슬라이스나 범위를 지정할 때 길이를 계산하기 쉽습니다.
  2. 시작점과 중단점을 모두 지정할 때도 길이를 계산하기 쉽습니다. 단지 중단점에서 시작점을 빼면 됩니다.
  3. 인덱스를 기준으로 겹침 없이 시퀀스를 분할하기 쉽습니다. 단지 my_list[:x]와 my_list[x:]로 지정하면 됩니다.
profile
데이터데이터데이터!!

0개의 댓글