boostcamp AITech

[3일차] 파이썬을 파이썬답게 쓰자! 1️⃣-자료구조와 collections-

라이크나우 2021. 1. 20. 17:57

오늘은 제목 그대로 파이썬을 파이썬 답게 쓰기 위한 교육이었다. 어쩜 이렇게 내가 평소에 거슬리고 신경쓰였지만 찾아보기엔 또 참을만해서 넘어갔던 부분들만 쏙 가르쳐주시는지.

 

자료구조는 나의 아픈 학부 성적을 떠올리게하지만 이젠 꽤나 익숙해져서 잘 쓴다. 힣

 

그럼 우선 자료구조 먼저 설명하고, pythonic code에 대해서 설명하려한다.

 

data structure

이 짤 너무 좋다ㅋㅋㅋㅋㅋㅋㅋㅋ대머리까지 완벽!

stack

LIFO

위의 짤 처럼 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조이다

append()와 pop()을 활용!

queue

FIFO

역시 위의 짤 처럼 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조이다.

appendI()와 pop(0)을 활용!

tuple

별거 없고 값의 변경이 불가능한 리스트이다. 

[]가 아닌 ()로 선언하면 된다.

사용자의 실수에 의해 값이 바뀌는 등의 에러를 사전에 방지하기 위해 좋다!

 

값이 하나인 튜플은 반드시 ","를 붙여야 한다!

t=(1,) 이렇게! 쉼표가 없으면 그냥 정수 1로 인식한다.

set

중복 없는 리스트이다. 

>>>s = set([1, 2, 3, 1])
>>>s
{1, 2, 3}

사실 리스트는 아니다. {} 중괄호로 표현된다. 리스트처럼 s[0]=8 이런식으로 접근은 불가능하다.

그렇다고 튜플처럼 immutable 하지도 않다. 

s.add(9)를 한다면 9가 추가되고(중복이 없을 경우에만 추가되는건 당연)

s.remove(1)을 한다면 1이 삭제된다. s.discard(1)도 마찬가지

s.update([5,6,7])를 한다면 5,6,7이 추가된다. s.update({5,6,7}) 이렇게 중괄호로 해도 똑같이 된다.

마지막으로, s.clear()은 모든 원소를 삭제한다.

 

그러니까 리스트도 아니고 튜플도 아닌 셋(집합)이라는 이름을 새로 붙인거겠지?

하튼 실제 집합의 연산도 모두 적용된다.

union, intersection, difference 모두!

dict

key, value 형태로 데이터를 저장하는 형태

난 참 딕셔너리를 많이 쓴다. 그냥 맘에 든다.

특히 키를 찾을 때 해쉬값으로 찾기 때문에 O(1) 시간이라는 말을 듣고는 더욱 꺼리낌없이 사용하는 중.

 

>>> country_code = {} # Dict 생성, country_code = dict() 도 가능 
>>> country_code = {"America": 1, "Korea": 82, "China": 86, "Japan": 81} 

>>> country_code.items() # Dict 데이터 출력 
Dict_items([('America', 1), ('China', 86), ('Korea', 82), ('Japan', 81)]) 

>>> country_code.keys() # Dict 키 값만 출력 
Dict_keys(["America", "China", "Korea", "Japan"]) 

>>> country_code["German"]= 49 # Dict 추가 
>>> country_code
{'America': 1, 'German': 49, 'China': 86, 'Korea': 82, 'Japan': 81} 

>>> country_code.values() # Dict Value만 출력
dict_values([1, 49, 86, 82, 81])

👆함수들은 위를 참고하자.

👇하지만 내가 가장 많이 쓰는건 fromkeys이다.

>>> keys=['apple','banana','cider']
>>> foods=dict.fromkeys(keys)
>>> foods
{'apple': None, 'banana': None, 'cider': None}

key list가 있을 때 전부 딕셔너리 키로 만든다. 벨류 디폴트는 none. 디폴트도 정할 수 있다.

foods=dict.fromkeys(keys,1) 로 파라미터 하나 추가하면 벨류가 전부 1로 초기화된다.

이거 정말 유용~

 

*참고로 list는 dict의 key값이 될 수 없다. 하지만 tuple은 가능하다.

collections

굳이 몰라도 상관은 없지만 알면 좋다는 말로 시작하고 강의하시면서는 다 알아야한다고 말씀하신 콜렉션~

 

오늘의 수확은 항상 의심하던 deque의 성능을 테스트해본 것ㅋㅋㅋㅋ

 

  • from collections import deque
  • from collections import Counter
  • from collections import OrderedDict
  • from collections import defaultdict
  • from collections import namedtuple

이구체적으론 이정도가 있다

 

deque

stack과 queue를 한번에 지원한다.

append appendleft popleft 등으로 사용하면 된다.

기존 list의 모든 기능은 다 지원한다. 

rotate, reverse 등 linked list의 특성도 지원한다!

 

popleft()의 성능을 확인하니 이렇게 시원할 수가 없다 ^^

pop()

 

pop(0)과 popleft()

 

 

ordereddict은 데이터를 입력한 순서대로 반환되지 않았던 문제점을 고친건데 이젠 그런 문제점이 고쳐졌으니 딱히 필요없다고한다~

defaultdict

key값이 없어도 오류를 내는게 아니라 0을 반환하는 착한 친구

from collections import defaultdict
d = defaultdict(object) 
d = defaultdict(lambda: 0) 
print(d["first"])

first라는 key가 없음에도 오류를 내뿜지 않고 0을 프린트해준다!

counter

sequence type의 data element들의 갯수를 dict 형태로 반환해준다.

적절한 타이밍에 쓴다면 편할 것 같다.

 

from collections import Counter

c = Counter()
c = Counter('gallahad')
print(c)

출력된 값은 아래와 같다.

Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})

word count 가 쉽겠다. 빅데이터처리 배울 때 맵리듀스로 열심히 실습했던 그친구,,,

namedtuple

tuple 형태로 data 구조체를 저장하는 방법이라고한다.

데이터의 구조체를 정해주고 나면 데이터를 처리하기가 편하다고한다.

난 파이썬으로 만드는 클래스 구조체 등에 약하다. 안배웠고 여태 쓸일도 없었기 때문. 이번 기회에 꼭 채울 것이다.

 

그래서인지 되게 생소했다 ㅎㅎ

 

그런데 음

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(x=11, y=22)

 

Point라는 이름의 덩어리가 하나 생긴다고 보면된다. 그 구성은 x와 y.

 

이어서 다음 페이지에서 마저 강의를 정리한다~

raiknow.tistory.com/55