스택과 큐(stack & Queue with list)
스택(stack)
나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조 - Last In First Out(LIFO)
data의 입력을 Push, 출력은 pop이라고 함.
ex) 4,10,15를 순서대로 입력 후 15, 10 순으로 출력
‘부스트코스 - AI 기본 다지기’의 강의 자료 중
list를 사용하여 스택구조 구현 가능 - 입력은 append(), 출력은 pop()을 사용
list = [1,2,3,4]
a.append(10) # 10 입력
a.append(11) # 11 입력
a.pop() # 11 출력
a.pop() # 10 출력
큐(Queue)
먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리구조 - First In First Out(FIFO)
Stack과는 반대되는 개념
ex) 기존 5,8,9,7에서 먼저 들어간 7을 출력, 3과 0을 입력, 다시 9와 8을 출력, 7을 입력
https://stackoverflow.com/questions/63113107/queue-enqueue-vs-dequeue-fill-out-table-shift-needed
list를 사용하여 Queue구조 재현가능 - 입력은 append(), 출력은 pop(0)을 사용
list = [1,2,3,4]
a.append(10) # 10 입력
a.append(11) # 11 입력
a.pop(0) # 1 출력
a.pop(0) # 2 출력
튜플과 집합(tuple & set)
튜플(tuple)
값의 변경이 불가능한 리스트(list) - 선언 시 [ ]가 아니라 ( )를 사용한다.
리스트의 연산, 인덱싱, 슬라이싱 등을 동일하게 사용가능
💡 왜 list가 아닌 tuple을 사용할까?
프로그램을 작동하는 동안 변경되지 않은 데이터의 저장을 위해서. 변경이 되면 안되는 고유번호(학번, 주민번호, 이름) 등
함수의 반환 값등 사용자의 실수에 의한 에러를 사전에 방지
Tips
>>> t = (1) # 일반 정수로 인식
1
>>> t = (1, ) # 튜플로 인식
(1,) # 값이 하나인 Tuple은 반드시 ","를 사용해야함.
집합(Set)
수학의 집합의 개념과 유사함.
값을 순서없이 저장 - 중복을 허용하지 않는 자료형, set() 객체 선언을 이용하여 객체 생성
ex) set 사용의 예시
>>> s = set([1,2,5,5,2,5,3,3,4]) # s = {1,2,5,5,2,5,3,3,4}도 사용가능
>>> s
{1,2,3,4,5}
>>> s.add(1) # 1을 추가해도 중복으로 추가x
>>> s
{1,2,3,4,5}
>>> s.remove(1) # 1 삭제
{2,3,4,5}
>>> s.update([1,7,8,9]) # 1,7,8,9 추가
>>> s
{1,2,3,4,5,7,8,9}
>>> s.discard(3) # 3 삭제
>>> s
{1,2,4,5,7,8,9}
>>> s.clear() # 모든 원소 지우기
>>> s
set()
참고) 수학에서 사용하는 집합연산 가능 ‘Set’관련 method는 수학 관계 함수 의 Set부분 참고
사전(Dictionary)
사전(dict)
데이터를 저장 할 때 구분할 수 있는 값(key 또는 Identifier라고 함)을 함께 저장
key 값을 활용하여, 데이터 값(Value)를 관리함
key와 value를 매칭하여 key로 value를 검색 (타언어에서는 Hash Table이라는 용어를 사용)
{key1:value1, key2:value2, key3:value3, … }
ex) 헤드라인을 key로 하고 value를 관리한다고 했을 때,
data = {"학번" : 20150230, "이름" : "홍길동", "생년월일" : "1995-04-03",\\
"주소" : "서울시 동대문구"}
>>> data["학번"] # "학번" 값 호출
20150230
>>> data["학번"] = 20150909 # "학번"의 값 새로 입력
>>> data["학번"] # "학번" 값 호출
20150909
Tips. items()를 활용하면 key와 value가 언패킹을 할 수 있음.
korea_city_num = {"서울" : "02", "경기" : "031", "인천" : "032"}
for a, b in korea_city_num.items():
print(a, b)
참고) 사전 관련 함수는 자료형 관련 함수 의 Dictionary 부분 참조
Collection 모듈
list, Tuple, Dict에 대한 python Built-in 확장 자료 구조(모듈)
편의성, 실행 효율 등을 사용자에게 제공
deque
stack과 queue를 지원하는 모듈 - list에 비해 효율적인 자료 저장방식을 지원함
from collections import deque
deque_list = deque()
for i in range(5):
deque_list.append(i)
print(deque_list) # deque([0, 1, 2, 3, 4])
deque_list.appendleft(10)
print(deque_list) # deque([10, 0, 1, 2, 3, 4])
rotate, reverse 등 Linked List의 특성을 지원. (여기서부터는 아직 제대로 사용해 보지 못해 이해가 어려움)
기존 list의 함수를 모두 지원함
deque는 기존 list 보다 효율적인 자료구조를 제공
효율적 메모리 구조로 처리속도 향상
Counter
Sequence type의 data element들의 갯수를 dict형태로 반환
ex) red, blue, green의 갯수를 세고 저장
cnt = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) # "ans" 문자열도 됨
cnt # Counter({'blue': 3, 'red': 2, 'green': 1})
set의 연산을 지원함. (합집합 ⇒ 각 element의 합, 교집합 ⇒ 공통되는 갯수 반환, 차집합 ⇒ 빼기 등)
OrderedDict
dict와 달리, 데이터를 입력한 순서대로 dict를 반환함. (but! python 3.6부터는 일반 dict도 입력한 순서를 보장)
dict type의 값을 value 또는 key 값으로 정렬할 때 사용가능
d = {"x":100,"y":200,"z":300,"l":500}
for k, v in OrderedDict(sorted(d.items(), key= lambda t: t[0])).items():
print(k, v)
# l : 500, x : 100, y : 200, z : 300
for k, v in OrderedDict(sorted(d.items(), key= lambda t: t[1])).items():
print(k, v)
# x : 100, y : 200, z : 300, l : 500
defaultdict
dict type의 값에 기본값을 지정, 신규값 생성시 사용하는 방법
ex) 초기값을 빈 list로 하는 defaultdict 생성하여 key, value값을 입력하는 기본 예시
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
namedtuple
Tuple 형태로 Data 구조체를 저장하는 방법
저장되는 data의 variable을 사전에 지정해서 저장함.
# Basic example
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22) # 위치 또는 키워드를 이용하여 값 입력
p[0] + p[1] # 일반적인 튜플 (11, 22)과 같이 인덱싱 할 수 있음.
33
x, y = p # 언팩킹이 가능함
x, y
(11, 22)
p.x + p.y # 필드이름으로 호출 가능
33
p # name=value 형태로 읽기 가능
Point(x=11, y=22)
'개발자 공부' 카테고리의 다른 글
Python Object Oriented Programming (1) | 2023.05.17 |
---|---|
python 스타일 코드 (0) | 2023.05.16 |
Function 2 (0) | 2023.05.11 |
String(문자열) (0) | 2023.05.10 |
Console 및 입출력 (0) | 2023.05.09 |