새소식

부스트캠프 AI Tech 4기

2. Data Structure/Pythonic Code

  • -

Python Data Structure

▮ Stack

  • 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • Last In First Out
  • 리스트를 사용하여 구현 가능
>>> a = [1,2,3,4]

>>> a.append(5)
>>> print(a)
# [1,2,3,4,5]

>>> a.pop()
>>> print(a)
# [1,2,3,4]

 

 Queue

  • 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • First In First Out
  • 리스트 혹은 collections.deque을 사용하여 구현 가능
>>> a = [1, 2, 3, 4]

>>> a.append(5)
>>> print(a)
# [1,2,3,4,5]

>>> a.pop(0)
>>> print(a)
# [2,3,4,5]

 

Tuple

  • 값의 변경이 불가능한 리스트
  • ( )

변경하려고 할 경우 Error 발생

>>> t = (1, 2, 3)

>>> t[1] = 5

# Traceback (most recent call last):
#   File "Week1/Day1/Variables.py", line 3, in <module>
#     t[1] = 5
# TypeError: 'tuple' object does not support item assignment

튜플의 값이 1개라면 ','를 추가해 주어야 한다.

>>> t = (1)
>>> print(t)
>>> print(type(t))
# 1
# <class 'int'>

>>> t2 = (1,)
>>> print(t2)
>>> print(type(t2))
# (1,)
# <class 'tuple'>

 

Set

  • 데이터의 중복을 허용하지 않는 자료형
  • set 객체 선언을 이용하여 객체 생성
>>> s = set([1, 2, 3, 1, 2, 3])  # s = {1,2,3,1,2,3}
>>> print(s)
# {1, 2, 3}

>>> s.add(1)  # 1 추가
>>> print(s)
# {1, 2, 3}

>>> s.remove(1)  # 1 삭제
>>> print(s)
# {2, 3}

>>> s.update([1, 2, 3, 4, 5])  # 1,2,3,4,5 추가
>>> print(s)
# {1, 2, 3, 4, 5}

>>> s.discard(3)  # 3 삭제
>>> print(s)
# {1, 2, 4, 5}

>>> s.clear()  # 모든 원소 삭제
>>> print(s)
# set()
  • 집합의 연산 수행 가능
>>> s1 = set([1, 2, 3, 4, 5])
>>> s2 = set([3, 4, 5, 6, 7])

# 합집합
>>> s1.union(s2)  # s1 | s2
# {1,2,3,4,5,6,7}

# 교집합
>>> s1.intersection(s2)  # s1 & s2
# {3,4,5}

# 차집합
>>> s1.difference(s2)  # s1 - s2
# {1,2}

 

Dict

  • 데이터를 저장할 때 구분지을 수 있는 값을 함께 저장
  • 구분을 위한 데이터 고유 값을 key라고 함
>>> characters = {"도화가": 1472.5, "건슬링어": 1430, "블레이드": 1403}

>>> for dict_item in characters.items():
        print(dict_item)
# ('도화가', 1472.5)
# ('건슬링어', 1430)
# ('블레이드', 1403)

>>> for dict_key in characters.keys():
        print(dict_key)
# 도화가
# 건슬링어
# 블레이드

>>> characters.values()
# dict_values([1472.5, 1430, 1403])

 

Collections

  • list, tuple, dict에 대한 확장 자료구조(모듈)
  • 편의성, 실행 효율 등을 사용자에게 제공
from collections import deque
from collections import defaultdict
from collections import Counter
from collections import namedtuple

 

∎ deque

  • stack과 queue를 지원함
  • 기존 list보다 효율적인 자료구조 제공
  • rotate, reverse 등 Linked List의 특성을 지원함
>>> from collections import deque

>>> queue = deque()
>>> for i in range(5):
        queue.append(i)
>>> print(queue)
# deque([0, 1, 2, 3, 4])

>>> queue.appendleft(216)
>>> print(queue)
# deque([216, 0, 1, 2, 3, 4])

>>> queue.rotate(1)
>>> print(queue)
# deque([4, 216, 0, 1, 2, 3])

 

∎ defaultdict

  • dict type의 값에 기본 값을 지정한다.
  • 신규 값 생성 시 사용하는 방법
>>> d = dict()
>>> print(d['first'])
# KeyError : 'first'
>>> from collections import defaultdict

>>> d = defaultdict(lambda : 216)
>>> print(d['first'])
# 216

 

∎  Counter

  • Sequence type의 data element들의 갯수를 dict 형태로 반환
>>> from collections import Counter

>>> c = Counter("Hello ML Engineer")
>>> print(c)
# Counter({'e': 3, 'l': 2, ' ': 2, 'n': 2, 'H': 1, 'o': 1, 'M': 1, 'L': 1, 'E': 1, 'g': 1, 'i': 1, 'r': 1})

 

∎  namedtuple

  • Tuple 형태로 data 구조체를 저장하는 방법
  • 잘 안씀
>>> from collections import namedtuple

>>> Point = namedtuple("Point", ["x", "y"])
>>> p = Point(11, 22)
>>> print(p) # Point(x=11, y=22)
>>> print(p[0], p[1]) # 11 22

 

 


Pythonic Code

▮ List Comprehension

>>> word_1 = "Maple"
>>> word_2 = "Lost"
>>> result = [i+j for i in word_1 for j in word_2]
>>> result
# ['ML', 'Mo', 'Ms', 'Mt', 'aL', 'ao', 'as', 'at', 'pL', 'po', 'ps', 'pt', 'lL', 'lo', 'ls', 'lt', 'eL', 'eo', 'es', 'et']

 

▮ lambda & map & reduce

∎  lambda

  • 함수 이름 없이, 함수처럼 쓸 수 있는 익명함수
  • PEP8에서는 lambda의 사용을 권장하지 않는다.
>>> f = (lambda x, y: x + y)
>>> f(1,2)
# 3

 

∎  map

  • 시퀀스형 데이터에 함수를 각각 적용하는 함수
>>> ex = [1,2,3,4,5]
>>> f = lambda x: x ** 2
>>> list(map(f, ex))  # py3는 iteration을 생성하기 때문에 list로 감싸 주어야 함
# [1, 4, 9, 16, 25]

아래처럼 쓰는게 더 직관적이고 편리하기 때문에 map을 권장하지는 않음

>>> [f(val) for val in ex]

 

∎  reduce

  • list에 똑같은 함수를 적용해서 통합
  • 대용량의 데이터를 다룰 때 많이 사용함
from functools import reduce

print(reduce(lambda x, y: x + y, [1,2,3,4,5]))

 

▮ iterable object

  • sequence형 자료형에서 데이터를 순서대로 추출하는 오브젝트
  • 내부적 구현으로 __iter__과 __next__가 사용됨
  • iter(sequential 자료형) → memory 주소를 가져옴
    값을 실제로 볼려면 next(iter(sequential 자료형))
  • iterable 객체에는 한번에 모든 데이터의 주소를 알고 있는 것이 아니라 다음 위치만 알고 있다.
>>> books = ["핸즈온 머신러닝", "나인폭스갬빗", "팩트풀니스"]
>>> iter_obj = iter(books)
>>> print(next(iter_obj))
# 핸즈온 머신러닝
>>> print(next(iter_obj))
# 나인폭스갬빗
>>> print(next(iter_obj))
# 팩트풀니스

 

▮ generator

  • iterable object를 특수한 형태로 사용해주는 함수
  • element가 사용되는 시점yield를 사용하여 값을 메모리에 반환 (iterator에 비해 메모리 절약)
  • list 타입의 데이터를 반환해주는 함수는 generator로 만드는 것이 좋음
  • 중간 과정에서 loop이 중단될 수 있을 때 큰 데이터를 처리할 때는 generator expression을 고려
  • 파일 데이터를 처리할때도 generator를 쓰는 것이 좋음

∎  generator comprehension

  • [] 대신에 ()를 사용하여 표현해야 한다.
>>> gen_ex = (n*n for n in range(100))
>>> gen_ex
# <generator object <genexpr> at 0x0000021ECF60CAC0>

 

▮ Function passing arguments

  • 함수에 입력되는 arguments의 다양한 형태
    • Keyword arguments
    • Default arguments
    • Variable-length arguments

∎  Keyword arguments

  • 함수에 입력되는 parameter의 변수명을 사용해서 arguments를 넘긴다.
def print_hello(my_name, your_name):
	print(f"Hi {your_name}! i'm {my_name}")
    
print_hello(your_name="Kong", my_name="Byeol")

 

∎  default arguments

  • parameter의 기본값을 사용하여 입력하지 않을 경우 기본값 출력
def print_hello(my_name, your_name="mio"):
	print(f"Hi {your_name}! i'm {my_name}")
    
print_hello(my_name="Byeol")

 

Variable-length asterisk (가변인자)

  • 함수의 parameter가 정해지지 않았을 경우 사용
  • 입력된 값은 tuple type으로 사용할 수 있음
  • 일반적으로 *args를 변수명으로 사용
>>> def asterisk_test(a,b,*args):
>>> 	return a+b+sum(args)
>>> print(asterisk_test(1,2,3,4,5))
# 15

 

Keyword variable-length asterisk (키워드 가변인자)

  • Parameter 이름을 따로 지정하지않고 입력하는 방법
  • asterisk(*) 두 개를 사용하여 함수의 parameter를 표시함
  • 입력된 값은 dict type으로 사용할 수 있음
  • 가변인자는 오직 한 개만 기존 가변인자 다음에 사용
>>> def kwargs_test_3(one, two,*args,**kwargs):
>>>     print(one + two + sum(args))
>>>     print(kwargs)
    
>>> kwargs_test_3(3,4,5,6,7,8,9,first=3,second=4,third=5)
# 42
# {'first': 3, 'second': 4, 'third': 5}

 

asterisk - unpacking a container

  • tuple, dict 등 자료형에 들어가 있는 값을 unpacking
  • 함수의 입력값, zip 등에 유용하게 사용가능
>>> 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, 3, 5)
# (2, 4, 6)

 

 


부스트캠프 AI Tech 교육 자료를 참고하였습니다.

728x90

'부스트캠프 AI Tech 4기' 카테고리의 다른 글

5. Python data handling  (0) 2022.09.23
5. Numpy  (0) 2022.09.23
4. Module and Project/가상환경  (2) 2022.09.21
3. 객체지향 프로그래밍  (0) 2022.09.19
1. Variables/String & Advanced function concept  (0) 2022.09.16
Contents