본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 라이브러리 3장 - 다양한 데이터 다루기3 (맥OS 기준)

OS: MAC

참고: 👉 점프 투 파이썬 - 라이브러리 예제 바로가기

008. 앞뒤에서 자료를 넣고 빼려면? ― collections.deque(데크)

구분 설명 예제 결과
모듈 임포트 deque 사용 준비 from collections import deque  
기본 생성 리스트로 초기화 가능 from collections import deque
dq = deque([1, 2, 3])
print(dq)
deque([1, 2, 3])
맨 뒤 추가 append() from collections import deque
dq.append(4)
print(dq)
deque([1, 2, 3, 4])
맨 앞 추가 appendleft() from collections import deque
dq.appendleft(0)
print(dq)
deque([0, 1, 2, 3, 4])
맨 뒤 제거 pop() from collections import deque
 
dq.pop()
② dq.pop()
    print(dq)
① 4
② deque([0, 1, 2, 3])
맨 앞 제거 popleft() from collections import deque
① dq.popleft()
② dq.popleft()
    print(dq)
0

deque([1, 2, 3])
큐(queue) 구조 (FIFO) append()로 넣고
popleft()로 빼기
task = deque([])
task.append('A')
task.popleft()
'A'
스택(stack) 구조 (LIFO) append()로 넣고
pop()로 빼기
stack = deque([])
stack.append('A')
stack.pop()
'A'
전체 초기화 clear() from collections import deque
dq.clear()
print(dq)
deque([])
확장 (여러 값 추가) extend() 또는
extendleft()
from collections import deque
   
dq.extend([4,5])
    print(dq)

from collections import deque
    dq.extendleft([-1,0])
    print(dq)
① deque([4, 5])

deque([0, -1, 4, 5])
회전
(양수 → 오른쪽, 음수 → 왼쪽)
rotate(n) from collections import deque
dq.rotate(1)
print(dq)
deque([5, 0, -1, 4])
최대 길이 제한 deque(maxlen=n) from collections import deque
dq = deque([1,2,3], maxlen=3)
dq.append(4)
print(dq)
deque([2, 3, 4], maxlen=3)
# 환경에 따라 maxlen=3이 생략될 수도 있음.
양쪽 삽입/삭제 성능
대량 데이터 처리 시 성능 차이 큼

양쪽 삽입/삭제가 잦다면
 → deque

랜덤 인덱스 접근이 필요하다면
 → list
리스트보다 훨씬 빠름 (O(1)) ① from collections import deque
import time
N = 100_000    # 10만 번 테스트
lst = []
start = time.time()
for i in range(N):
     lst.insert(0, i)    #맨 앞에 삽입
print(f"list insert(0, i): {time.time() - start:.4f}초")

② from collections import deque
import time
N = 100_000
dq = deque()
start = time.time()
for i in range(N):
    dq.appendleft(i)
print(f"deque appendleft(i): {time.time() - start:.4f}초")
① list insert(0, i): 38110초

 deque appendleft(i): 0.0118초

 

라이브러리 예제 문제: 다음과 같이 시계방향으로 1~5가 적힌 다이얼이 있으며 현재 가리키는 눈금은 1이다. 이 다이얼을 시계방향으로 2칸 회전시켜 가리키는 눈금이 4가 되도록 하려면 어떻게 해야 할까?

시계 문제 이미지
풀이 및 결과: deque([3, 4, 5, 1, 2])

 

009. 자료에 이름을 붙이려면? ― collections.namedtuple(네임드튜플)

구분 설명 예제 결과
모듈 임포트 namedtuple 사용 준비 from collections import namedtuple  
튜플 생성 구조체처럼 필드명 지정 from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p)
Point(x=10, y=20)
# (p.x, p.y)불변 객체
필드 접근 이름으로 값 접근 from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)
10 20
튜플 언패킹 튜플처럼 여러 변수로 분리 가능 x, y = p
print(x, y)
10 20
딕셔너리 변환 _asdict()로 변환 가능 print(p._asdict()) {'x': 10, 'y': 20}
값 교체 _replace()로 새 튜플 생성 p2 = p._replace(y=99)
print(p2)
Point(x=10, y=99)

라이브러리 예제 문제: 값이 아닌, 코드를 구하라.

3장 9번의 문제
3장 9번의 문제 풀이 및 결과

010. 사용한 단어 개수를 구하려면? ― collections.Counter(카운터)

- Counter는 공백, 특수문자, 대소문자 구분을 그대로 유지. 즉 " "(공백)도 하나의 key로 카운트됨.

- lower()나 upper()로 바꾸면 대소문자 무시도 가능

구분 설명 예제 결과
모듈 임포트 Counter 사용 준비 from collections import Counter  
요소 개수 세기 리스트, 문자열 등에서
개수 자동 계산
from collections import Counter
words = ['apple', 'banana', 'apple']
count = Counter(words)
print(count)
Counter({'apple': 2, 'banana': 1})
가장 많은 항목 most_common()으로 상위 빈도 출력 print(count.most_common(1)) [('apple', 2)]
딕셔너리처럼
접근
키로 직접 값 접근 가능 print(count['banana']) 1
요소 확장 elements()로
각 요소 반복
print(list(count.elements())) ['apple', 'apple', 'banana']

라이브러리 예제 문제: 다음은 김소월의 시 '산유화'이다. 이 시에서 가장 많이 사용한 단어와 그 개수를 구하려면 어떻게 해야 할까?

문제 코드
산에는 꽃 피네.
꽃이 피네.
갈 봄 여름없이
꽃이 피네.

산에
산에
피는 꽃은
저만치 혼자서 피어있네.

산에서 우는 새여
꽃이 좋아
산에서
사노라네.

산에는 꽃지네
꽃이 지네.
갈 봄 여름 없이
꽃이 지네.

값: [('꽃이', 5)]

011. 딕셔너리를 한 번에 초기화하려면? ― collections.defaultdict

구분 설명 예제 결과
모듈 임포트 defaultdict 사용 준비 from collections import defaultdict  
기본값 지정 없는 키 접근 시
자동 초기화
from collections import defaultdict
dd = defaultdict(int)
dd['apple'] += 1
dd['banana'] += 2
print(dd)
defaultdict(<class 'int'>, {'apple': 1, 'banana': 2})
리스트 기본값 list형 기본값 활용 dd2 = defaultdict(list)
dd2['fruit'].append('apple')
print(dd2)
defaultdict(<class 'list'>, {'fruit': ['apple']})
set 기본값 set형 기본값 활용 dd3 = defaultdict(set)
dd3['num'].add(10)
print(dd3)
defaultdict(<class 'set'>, {'num': {10}})

라이브러리 예제 문제: 사용한 문자(key)와 해당 문자의 사용 횟수(value)를 딕셔너리로 만들려면 어떻게 해야 할까?

문제
풀이

+ 순서를 유지하는 딕셔너리를 쓰려면? —collections.OrderedDict(오더드딕셔너리)

구분 설명 예제 결과
모듈 임포트 OrderedDict 사용 준비 from collections import OrderedDict  
기본 생성 입력 순서가 유지되는
딕셔너리
od = OrderedDict()
od['a']=1; od['b']=2; od['c']=3
print(od)
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
순서 변경 move_to_end()으로
항목 재배치
od.move_to_end('a')
print(od)
OrderedDict([('b', 2), ('c', 3), ('a', 1)])
정렬 가능 정렬 후 다시
OrderedDict로 변환
od2 = OrderedDict(sorted(od.items()))
print(od2)
OrderedDict([('a',1), ('b',2), ('c',3)])