3-1. Python Data Structure

유승우·2022년 5월 2일
0

Stack


  • Last In First Out(LIFO) 구조로써, 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조

  • pop() : 리스트의 맨 끝에 있는 데이터를 제거함과 동시에 그 값을 반환

  • append() : 리스트에 원소 추가

  • Stack을 활용한 입력된 글자의 역순으로 출력


word = input("Input a word : ")
word_list = list(word)

for _ in range(len(word_list)):
	print(word_list.pop())
	print(word_list)

Queue


  • Stack의 반대인 First In First Out(FIFO) 구조로써, 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • append() 와 pop(0)를 사용
a = [1,2,3,4,5]
a.append(10)
a.append(20)
a.pop(0) # 1을 출력
a.pop(0) # 2를 출력

Tuple


  • 리스트의 구조와 같지만 값의 변경이 불가능한 리스트
  • Tuple 선언 시 []가 아닌 ()를 사용
  • 프로그램을 작동하는 동안 바뀌어선 안되는 데이터들을 주고 받을 때 사용
  • 함수의 반환 값 등 사용자의 실수에 의한 에러를 사전에 방지

Set


  • 값을 순서 없이 저장하며, 중복이 없는 자료형
  • set() 함수를 사용하여 생성
  • 수학에서 활용하는 다양한 집합연산이 가능하다
  • remove 와 discard의 차이 : 지우려는 element 가 없는 경우 remove는 Keyerror가 나타나고, discard는 정상적으로 작동한다.
s = set([2,3])
s.add(1) # s = {1,2,3} 한 원소 1 추가
s.remove(1) # s = {2,3} 1 삭제
s.update([1,4,5,6,7]) # s = {1,2,3,4,5,6,7} [1,4,5,6,7] 추가
s.discard(3) # 3 삭제
s.claer() # 모든 원소 삭제

# 집합연산
s1 = set([1,2,3,4,5])
s2 = set([3,4,5,6,7])

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

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

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

Dictionary


  • 데이터를 저장 할 때 구분 지을 수 있는 값(Key)을 함께 저장하며, Key를 이용해 데이터(Value)를 관리
country_code = {"America" : 1, "Korea" : 82, "China" : 86, "Japan" : 81} # Dict 
country_code.items() # Data 출력
country_code.keys() # Key 출력
country_code["German"] = 49 # Dict 추가
country_code.values() # Value 출력

# Dict unpacking
for k,v in country_code.items():
	print("Key : " , k)
	print("Value : ", v)

# Key 또는 Value에 특정값 포함 여부
"Korea" in country_code.keys()
82 in country_code.values()

Collections


  • List, Tuple, Dict에 대한 Python Built-in 확장 자료 구조로써, 편의성과 실행 효율을 제공

  • depue

    • Queue 와 Stack을 한번에 지원하는 모듈이며, List에 비해 효율적인 메모리 구조로 처리 속도가 빠르다
    • rotate, revsere등 Linked List의 특성을 지원
    • Linked List : 메모리에 값들이 고정적으로 차례대로 연결되어 있지 않고, 유연하게 시퀀스형 데이터를 표현할 수 있는 메모리 구조
from collections import deque

deque_list = deque() # deque 생성
for i in range(5):
		deque_list.append(i) # deque에 0부터 4까지의 원소 추가
deque_list.appendleft(10) # deque의 가장 왼쪽에 10 추가
deque_list # deque([10,0,1,2,3,4])

deque_list.rotate(1) # 한 칸씩 옆으로 이동
deque_list # deque([4,10,0,1,2,3])

deque.extend([5,6,7]) # 원소들을 차례로 뒤에 추가
deque_list # deque([4,10,0,1,2,3,5,6,7])

deque.extendleft([5,6,7]) # 원소들을 차례로 앞에 추가
deque_list # deque([7,6,5,4,10,0,1,2,3,5,6,7])

%timeit general_list() # 평균적인 실행 속도를 나타내는 모듈

OrderedDict


  • 데이터를 입력한 순서대로 dict를 반환하지만 Python 3.6 부터 입력한 순서를 보장하여 출력하기 때문에 개념만 알고 넘어가기!

Defaultdict


  • 신규 값을 생성할 때 특정한 값을 지정을 해서 그 값이 항상 출력될 수 있도록 하는 구조
  • 초기값(Key)을 지정하지 않아도 dict를 생성할 수 있다
from collections import defaultdict
d = defaultdict(object) # default dictionary 생성
d = defaultdict(lambda: 0) # default 값을 0으로 설정
print(d["first"])

Counter


  • 시퀀스 타입의 데이터 원소들의 갯수를 세서 dict 형태로 반환
  • Counter는 Set의 연산들을 지원함
from collections import Counter

c = Counter()
c = Counter('gallahad')
print(c) # Counter({'a': 3, 'l': 2, 'g': 1, 'd': 1, 'h': 1})
print(list.c.elements()) # 결과값을 list 형태로 반환

c = Counter(a=4,b=2,c=0,d=-2)
d = Counter(a=1,b=2,c=3,d=4)
c.subtract(d) # 두 개의 Counter에서 element 값 빼기
print(c) # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

# set 연산 지원
print(c+d)
print(c&d)
print(c|d)

Namedtuple


  • Tuple 형태로 Data 구조체를 저장하는 방법
  • 데이터를 저장을 하는데 어떤 식으로 저장할지 사전에 약속하는 것

0개의 댓글