[AITech] 20220118 - Python data structure

2 minute read


강의 복습 내용

Python data structure

Stack

  • 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조(LIFO)
  • 리스트를 사용하여 스택 구조 표현 가능
    • push는 append(), pop은 pop() 사용

Queue

  • 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조(FIFO)
  • 리스트를 사용하여 큐 구조 표현 가능
    • put은 append(), get은 pop(0) 사용

Tuple

  • 값의 변경이 불가능한 리스트
    • 선언 시 “( )”로 선언
  • set, dict 등 원소(키)로 hashable element를 요구하는 자료 구조에 사용 가능

Set

  • 값을 순서없이 저장, 중복 불허하는 자료형
s1 = set([1,2,3,4,5])
s2 = set([3,4,5,6,7])
s1 = s1.union(s2) # s1 |= s2 (합집합)
# {1,2,3,4,5,6,7}
s1 = s1.intersection(s2) # s1 &= s2 (교집합)
# {3,4,5}
s1 = s1.difference(s2) # s1 -= s2 (차집합)
# {1,2}

Dict

  • 데이터를 저장할 때 구분 지을 수 있는 값을 함께 저장(key-value)
  • key 값을 활용하여, value 값을 관리
  • 다른 언어에서는 Hash Table이라는 용어를 사용

Collections

  • Python Built-in 확장 자료 구조(모듈)
  • 편의성, 실행 효율 등을 사용자에게 제공

  • deque
    • rotate, reverse 등 Linked List의 특성을 지원
    • 효율적 메모리 구조로 처리 속도 향상
# deque - Stack과 Queue를 구현하는데 List보다 효율적이고 빠른 저장 방식을 제공
# using collections module
from collections import deque
import time

start_time = time.time()
deque_list = deque()
# deque
for i in range(10**6):
    deque_list.append(i)
for i in range(10**6):
    deque_list.popleft()
print(time.time() - start_time, "seconds")
'''0.17937803268432617 seconds'''
# using list
import time

start_time = time.time()
just_list = []
for i in range(10**6):
    just_list.append(i)
for i in range(10**6):
    just_list.pop(0)
print(time.time() - start_time, "seconds")
'''102.59535932540894 seconds'''
  • OrderedDict
    • 데이터를 입력한 순서대로 dict를 반환
    • 일반 dict도 python 3.6부터는 입력한 순서를 보장하여 출력
  • defaultdict
    • Dict type의 값에 기본 값을 지정, 신규값 생성 시 사용하는 방법
from collections import defaultdict
d = defaultdict(lambda: 0) # 함수 형태로 사용
print(d["first"])
# 0
  • Counter
    • Sequence type의 data element들의 갯수를 dict 형태로 반환
from collections import Counter

# sequence -> dict
c = Counter('gallahad')
print(c)
'''
Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
'''

# dict -> list
c = Counter({'red':4, 'blue':2})
print(c)
print(c.elements())
print(list(c.elements()))
'''
Counter({'red': 4, 'blue': 2})
<itertools.chain object at 0x000001EDC28B65E0>
['red', 'red', 'red', 'red', 'blue', 'blue']
'''

# set의 연산들을 지원
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3)
print(c+d)
print(c&d)
print(c|d)
c.subtract(d)
print(c)
'''
Counter({'a': 5, 'b': 4, 'c': 3})
Counter({'b': 2, 'a': 1})
Counter({'a': 4, 'c': 3, 'b': 2})
Counter({'a': 3, 'b': 0, 'd': -2, 'c': -3})
'''

# 많은 순서대로 반환
Counter('Hello My name is Bread').most_common()
'''
[(' ', 4),
 ('e', 3),
 ('l', 2),
 ('a', 2),
 ('H', 1),
 ('o', 1),
 ('M', 1),
 ('y', 1),
 ('n', 1),
 ('m', 1),
 ('i', 1),
 ('s', 1),
 ('B', 1),
 ('r', 1),
 ('d', 1)]
'''
  • namedtuple
    • Tuple 형태로 Data 구조체를 저장
    • 저장된는 data의 varaible을 사전에 지정해서 저장
from collections import namedtuple
Point = namedtuple('Point', ['x','y'])
p = Point(11, y=22)
print(p[0] + p[1])
# 33

x, y = p
print(x, y)
print(p.x, p.y)
print(Point(11, 22))
'''
11 22
11 22
Point(x=11, y=22)
'''


Categories: ,

Updated:

Leave a comment