Python Data Structure

💡
파이썬에서 많이 사용되는 자료구조에 대해서 알아본다.

자료구조란?

자료구조란, 데이터의 저장 및 표현방식을 의미한다. 데이터의 특징에 따라 컴퓨터가 효율적으로 정리할 수 있는 자료구조가 있다. 이처럼 자료구조를 적절하게 사용하면 효율적인 컴퓨터 메모리 사용과 코드 작성이 가능하다.

Stack

스택은 가장 마지막에 넣은 데이터를 가장 먼저 반환하는 메모리 구조를 가지고 있는 자료구조이다. LIFO라 불리는 특징을 가지는 자료구조이다. 이는 파이썬의 list의 기능으로 구현하여 사용할 수 있다.

Queue

큐는 가장 먼저 넣은 데이터를 가장 먼저 반환하는 메모리구조를 가지고 있는 자료구조이다. FIFO라 불리는 특징을 가지는 자료구조이다. 파이썬의 기본 list를 통해 비슷하게 사용할 수 있으나, 데이터를 반환받는 pop(0) 메서드의 효율이 크게 차이가 난다.

Tuple

리스트와 같은 시퀀스형 자료구조이다. 단, 값을 변경할 수 없다는 점에서 리스트와는 차이가 있다.

Set

수학의 집합의 개념을 도입한 자료구조이다. 값의 순서가 보장되지 않으며, 요소 값에 중복이 없는 자료구조이다.

Dict

데이터를 저장할 때 구분할 수 있는 값을 함께 저장하는 자료구조이다. 구분할 수 있는 값은 key라고 부르며, 해당하는 데이터 값은 value라고 칭한다.

Collections Module

파이썬에 Built-in 되어 있는 확장형 자료구조 패키지 이다. 내부에는 다음과 같은 자료구조가 있다.

  • Deque : 우선순위 큐로 stack과 queue의 모든 연산을 지원한다. 또한 rotate나 reverse등 Linked List의 기능도 지원한다.
  • OrderedDict : 순서를 보장하는 Dict형태의 자료구조이다.
  • DefaultDict : 자료구조 내에 없는 key로 접근했을 때, 특정 값을 value로 초기화하는 Dict형태의 자료구조이다. 이 자료구조는 선언 시에, 전달인자로 자료형 혹은 함수객체를 전달해야 한다.
  • Counter : 시퀀스 타입의 자료구조를 입력받으면, 요소는 key로, 갯수는 value로 저장하는 Dict형태의 객체가 된다.
  • NamedTuple : 튜플형태로 데이터 구조체를 저장하는 방법이다. 저장되는 데이터의 변수를 사전에 지정해서 저장할 수 있다.


Pythonic code

💡
파이썬 특유의 문법에 대해 알아본다.

Pythonic Code란?

파이썬에는 Pythonic Way라는 고유한 철학이 있다. 이 철학의 골자는 사람이 이해하기 쉬운 언어를 지향한다는 것이다. 이런 파이썬만의 특징을 잘 살린 코드를 위와 같이 부를 수 있겠다. Pythonic Code는 고급 코드를 작성할 수록 더 필요해진다. 더 효율적인 코드를 구현하는 것 뿐만 아니라, 타인이 쓴 코드를 읽기 위해선 이에 익숙해져야 하는 것이다.

split() & join()

list.split(str)은 문자열을 기준값으로 잘라 list 형태로 반환하는 메서드이다. str.join(list)은 list의 각 요소 사이에 str을 추가해 str 형태로 반환하는 메서드이다.

list comprehension

기존 리스트를 사용하여 간단하게 다른 리스트를 만드는 기법이다. 리스트 내에서 반복문과 조건문을 통해 사용할 수 있다. 삼항연산자 혹은 중첩 반복문도 가능하다.

 >>> w1 = 'Hello'
 >>> w2 = 'World'
 >>> [i+j for i in w1 for j in w2]
 ['HW', 'Ho', 'Hr', 'Hl', 'Hd', 'eW', 'eo', 'er', 'el', 'ed', 'lW', 'lo', 'lr', 'll', 'ld', 'lW', 'lo', 'lr', 'll', 'ld', 'oW', 'oo', 'or', 'ol', 'od']
 >>> [[i+j for i in w1] for j in w2]
 [['HW', 'eW', 'lW', 'lW', 'oW'], ['Ho', 'eo', 'lo', 'lo', 'oo'], ['Hr', 'er', 'lr', 'lr', 'or'], ['Hl', 'el', 'll', 'll', 'ol'], ['Hd', 'ed', 'ld', 'ld', 'od']]
 >>> [i+j if i==j else '' for i in w1 for j in w2]
 ['', '', '', '', '', '', '', '', '', '', '', '', '', 'll', '', '', '', '', 'll', '', '', 'oo', '', '', '']

enumerate() & zip()

enumerate(iterable_obj)는 iterable 객체의 요소에 번호를 붙여 추출하는 함수이다. zip(iterable_obj1, iterable_obj2)는 각 객체의 요소끼리 묶어서 반환하는 함수이다.

 >>> list(enumerate(w1))
 [(0, 'H'), (1, 'e'), (2, 'l'), (3, 'l'), (4, 'o')]
 >>> list(zip(w1, w2))
 [('H', 'W'), ('e', 'o'), ('l', 'r'), ('l', 'l'), ('o', 'd')]
 >>> {v:i for i,v in enumerate(w1)}
 {'H': 0, 'e': 1, 'l': 3, 'o': 4}

lambda & map() & reduce()

lambda는 수학의 람다대수에서 유래한 익명 함수를 의미한다. map(function, iterable_obj)은 iterable 객체의 각 요소에 function을 적용하여 반환하는 함수이다. reduce(function, iterable_obj)은 function이 2개의 요소를 필요로 하는 경우에 사용할 수 있다.

 >>> (lambda x, y : x+y)(10, 50)
 60
 >>> list(map(lambda x : x*2, [1,2,3]))
 [2, 4, 6]
 >>> from functools import reduce
 >>> reduce(lambda x,y : x+y, [1,2,3])
 6

Generator

Generator는 데이터를 미리 만들어 저장하지 않고, 주소값만 저장하고 있다가 사용 시점에 메모리에 데이터를 올리는 객체이다. 메모리 상으로 큰 차이가 있기 때문에, 큰 데이터를 다룰때 가급적 활용해야하는 방법이다.

 >>> gen_ex = (n for n in range(100))
 >>> gen_ex
 <generator object <genexpr> at 0x0000015A6882FBA0>
 >>> sys.getsizeof(gen_ex)
 112
 >>> sys.getsizeof(list(gen_ex))
 976

Function Argument

함수 정의 시 *기호를 통해 다른 기능을 하는 parameter를 만들 수 있다. *가 붙은 parameter는 여러 값을 한 번에 전달받을 수 있고, 해당 값들을 tuple의 형태로 함수에 전달한다. **가 붙은 parameter는 key=value형태로 값을 입력받을 수 있고, dict의 형태로 함수에 전달한다.

Asterisk

Asterisk는 *기호를 통해 표현되며, Unpacking Container의 기능을 수행한다.

 >>> a,b,c = ([1,2], [3,4], [5,6])
 >>> print(a,b,c)
 [1, 2] [3, 4] [5, 6]
 >>> data = ([1,2], [3,4], [5,6])
 >>> print(*data)
 [1, 2] [3, 4] [5, 6]
 >>> for data in zip(([1,2], [3,4], [5,6])) :
 ...     print(data)
 ([1, 2],)
 ([3, 4],)
 ([5, 6],)
 >>> for data in zip(*([1,2], [3,4], [5,6])) :
 ...     print(data)
 (1, 3, 5)
 (2, 4, 6)


개인 학습

  • WSL Vesrion Upgrade

WSL Version Upgrade

WSL2로 UpgradeWSL로 Ubuntu Linux를 사용하고 있는데, 자꾸 upgrade하라는 메세지가 떠서, 이참에 upgrade를 했다. 생각보다 헤맸는데, 좋은 게시글 덕분에 무사히 Upgrade를 마칠 수 있었다. (Link)

+ Recent posts