[BoostCamp AI Tech / Day 2] Python Data Structure

newbie·2021년 8월 3일
0

Index

파이썬 기본 데이터 구조

  • Stack
    • Stack with list ojbect
  • 큐(Queue)
    • Queue with list object
  • 튜플(tuple)
  • 집합(set)
    • 집합의 연산
  • 사전(dictionary)
    • 사전(dictionary) 다루기

Collections

  • deque
  • orderedDict
  • defaultdict
  • Counter
  • namedtuple

파이썬 기본 데이터 구조

  • 스택과 큐(Stack & Queue with list)
  • 튜플과 집합(tuple & set)
  • 사전(dictionary)
  • Collection 모듈

Stack

  • 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • Last In First Out(LIFO)
  • Data 입력을 Push, 출력을 Pop 이라고 함

Stack with list ojbect

  • 리스트를 사용하여 스택 구조 구현
  • push를 append(), pop을 pop()으로 사용
tmp = [1,2,3,4,5]
tmp.append(1) #push
tmp.pop() #pop, 1 출력
tmp.pop() #pop, 5 출력

큐(Queue)

  • 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • First In First Out(FIFO)
  • data 입력을 put, 출력을 get이라고 함
  • Stack과 반대

Queue with list object

  • 파이썬의 리스트를 사용하여 큐 구조를 활용 가능
  • put은 append(), get은 pop(0)

튜플(tuple)

  • 값의 변경이 불가능한 리스트(immutable)
  • 선언 시 "[]"가 아닌 "()"를 사용
  • 리스트 연산, 인덱싱, 슬라이싱 등을 동일하게 사용 가능
  • 값이 하나 인 경우엔 Tuple 선언 시 반드시 ","를 붙여야 함
  • 튜플을 사용하면, 변경이 불가하므로 사용자 실수에 의한 데이터 변환을 사전에 방지할 수 있음

    tmp = (1,2,3) / tmp = (1,)

집합(set)

  • 값의 순서 없이 저장, 중복을 불허하는 자료형
  • set 객체 선언을 이용하여 객체 생성
  • set의 method, tmp = set([1]) 시
tmp.add(2) # 원소 2 추가, 중복 불허
tmp.update([2,3,4]), #다수의 원소 추가, 중복 불허
tmp.remove(2) #원소 2 제거
tmp.remove(2) => KeyError 발생 #원소 2가 없는 상태에서 진행했기 떄문
tmp.discard(3) #원소 3 제거
tmp.discard(3) #정상 동작, 원소 존재 여부 고려X
tmp.clear() #원소 모두 삭제
  • remove vs discard
    • 둘 다 원소를 지우는 기능
    • remove는 해당 원소가 있을 경우 동작(없을 경우 키에러 발생)
    • discard는 원소의 존재를 고려하지 않고 동작

집합의 연산

  • 수학에서 활용하는 다양한 집합 연산 가능
s1 = set([1,2,3,4])
s2 = set([3,4,5,6])

#s1과 s2의 합집합, set([1,2,3,4,5,6])
s1 + s2 
s1.union(s2)

 #s1과 s2의 교집합, set([3,4])
s1 & s2
s1.intersection(s2)

#s1과 s2의 차집합, set([1,2])
s1 - s2
s1.difference(s2)

사전(dictionary)

  • 데이터를 저장할 때 구분 지을 수 있는 값을 함께 저장
    • 예) 주민등록 번호, 제품 모델 번호, 학번 등
  • 구분을 위한 데이터 고유 값을 identifier 또는 Key라고 함
  • Key 값을 활용하여, 데이터 값(Value)를 관리함
  • {key : value} 형태로 변수를 선언
# key가 152441223이고, value가 "hong"일 때
tmp = {152441223 : "hong"}
print(tmp[152441223]) # "hong" 출력

사전(dictionary) 다루기

tmp = {1111 : "Hong", 1112 : "Ko"}

tmp.items() #dict의 데이터를 tuple 형태로 데이터 출력
>> dict_items([(1111,"Hong"), (1112,"Ko)])

tmp.keys() #dict 키 값만 출력
>> dict_keys([1111,1112])

tmp.values() #dict value만 출력
>> dict_values(["Hong","Ko"])

tmp[1113] = "Kim" #Dict 추가
tmp
>> {1111 : "Hong", 1112 : "Ko", 1113 : "Kim"}

Collections

  • List, Tuple, Dict에 대한 Python Built-in 확장 자료 구조(모듈)
  • 편의성, 실행 효율 등을 사용자에게 제공
from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import nametuple

deque

  • stack과 queue를 지원하는 모듈
  • list에 비해 효율적인(빠른) 자료 저장 방식 지원
  • rotate나 reverse등 Linked List 특성 지원
    • deque는 모든 값들이 메모리에 차례대로 연결되는 구조 X
    • 현재 값의 주소와 다음 값의 주소를 가리키는 형태로 구성됨
    • 특정 데이터를 자르고 다른 데이터를 가리키는 것이 유연하게 작동
  • 기존 list 형태의함수를 모두 지원
from collections import deque
deque_list = deque([1,2,3,4]) #deque 자료 구조형으로 변수 선언

deque_list.append(1) # 데이터를 마지막에 추가, deque([1,2,3,4,1])
deque_list.appendleft(1) # 데이터를 처음에 추가,deque([1,1,2,3,4,1])

deque_list.pop() # 마지막 데이터 출력, deque([1,1,2,3,4])
deque_list.popleft() # 첫번째 값 제거 == pop(1), deque([1,2,3,4])

deque_list.rotate(n) #원소들을 n칸씩 우측으로 회전

deque_list.extend([5,6,7]) #원소 다수 추가, deque([1,2,3,4,5,6,7])

deque_list.extendleft([5,6,7]) #deque([7,6,5,1,2,3,4,5,6,7])

orderedDict

  • Dict와 달리 데이터를 입력한 순서대로 dict를 반환
  • 단, dict도 python 3.6부터 입력한 순서를 보장하여 출력
  • 따라서, 현재는 굳이 사용할 필요는 없음

defaultdict

  • Dict type의 값에 기본 값을 지정, 신규 갑 생성 시 사용하는 방법
from collections import defaultdict
tmp = defaultdict() #defaultdict 생성
tmp = defaultdict(lambda : 0) #default 값으로 0 설정
for s in ["aa","bb","cc","aa"]:
  tmp[s] += 1
  # Key가 없으면 default 값에 1을 추가하여 저장
tmp
>> {"aa" : 2, "bb" : 1, "cc" : 1}

Counter

  • Sequece type의 data element들의 갯수를 dict 형태로 반환
  • Counter 집합연산 사용 가능
    • 합집합(+), 교집합(&), 차집합(-), or연산(|)
      • 차집합(-)와 비슷하지만 조금 다른 subtract
      • subtact는 각 key의 value 값 자체에 대해서 연산을 수행함
      • 따라서 값이 마이너스(-)로도 출력됨
from collections import Counter
c= Counter('aabbccd')
d = Counter('de')
print(c)
>> Counter({'a':2,'b':2,'c':2,'d':1})
print(d)
>> Counter({'d':1,'e':1})
c - d
>> Counter({'a': 2, 'b': 2, 'c': 2})

c.subtract(d)
c
>> Counter({'a': 2, 'b': 2, 'c': 2, 'd': 0, 'e': -1})

namedtuple

  • Tuple 형태로 Data 구조체를 저장하는 방법
  • 저장되는 data의 variable을 사전에 지정해서 저장
  • 언패킹
from collections import namedtuple
Point = namedtuple("Point", ['x','y'])
p = Point(11,22)

x,y = p #언패킹
print(x,y)
>> 11 22
print(p.x, p.y) #.을 활용하여 출력도 가능
>>11 22
profile
DL, NLP Engineer to be....

0개의 댓글