파이썬의 라이브러리중 많이 쓰이는 대표적인 라이브러리 6가지 정도가 있다. 이 게시글에선 그 6개에 대해 간단하게 자주 쓰이는 방법 위주로 정리해보는 게시글이다.
간단 정리
- 내장함수 : print(), input() 과 같은 기본 입출력부터 sorted()같은 정렬 기능을 포함하고 있다.
- itertools : 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리다. 순열과 조합을 제공한다
- heapq : 힙(Heap) 기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용한다
- bisect : 이진탐색(Binary Search) 기능을 제공하는 라이브러리다
- collections : 덱(deque), 카운터(Counter)등의 유용한 자료구조를 포함하는 라이브러리다
- math : 필수적인 수학적 기능을 제공한다. 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련기능을 포함한다
내장 함수
별도의 import 없이 바로 사용할 수 있는 함수다.
sum() 함수는 리스트와 같은 객체가 입력으로 주어졌을 때 모든 원소의 합을 반환한다.
result = sum([1, 2, 3, 4, 5])
print(result) # => 15
min(), max() 함수는 파라미터가 2개 이상 들어왔을 때 가장 작은 혹은 큰 값을 반환한다.
result = min(7, 3, 5, 2)
print(result) # => 2
result = max(7, 3, 5, 2)
print(result) # => 7
eval() 함수는 수학 수식이 문자열 형태로 들어오면 수식을 계산한 결과를 반환한다.
result = eval("(3+5)*7")
print(result) # => 56
sorted() 함수는 iterable 객체가 들어왔을 때 정렬된 결과를 반환한다. key 속성으로 정렬 기준을 명시할 수 있으며 reverse 속성으로 정렬결과를 오름차순 혹은 내림차순으로 할지 정의할 수 있다
result = sorted([9, 1, 8, 5, 4]) # 오름차순 정렬
print(result) # => [1, 4, 5, 8, 9]
result = sorted([9, 1, 8, 5, 4], reverse = True) # 내림차순 정렬
print(result) # => [9, 8, 5, 4, 1]
리스트의 원소로 리스트나 튜플이 존재할 때 특정한 기준에 따라서 정렬을 수행할 수 있다.
다음은 원소를 튜플의 두 번째 원소(나이)를 기준으로 내림차순으로 정렬하고자 한 코드
result = sorted([('홍길동', 35),('이순신', 75), ('아무개', 50)], key = lambda x : x[1], reverse = True)
print(result) # => [('이순신', 75), ('아무개', 50), ('홍길동', 35)]
itertools
itertools는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리다.
많은 기능을 제공하지만 유용하게 사용하는 클래스는 permutations, combinations (순열, 조합) 이다.
permutations는 리스트와 같은 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)을 계산해준다.
permutations는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다. 리스트 ['A', 'B', 'C']에서 3개(r=3)를 뽑아 나열하는 모든 경우를 출력하는 예시는 다음과 같다
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 3) # 모든 순열 구하기
print(result)
#[ ( 'A', 'B', 'C'), ( 'A' , 'C', 'B' ), ( 'B' , 'A', '(' ), ('B', 'C' , 'A' ), ('C', 'A', 'B'), ( 'C', 'B' ,'A' )]
combinations는 리스트와 같은 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다.
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2)
print(result)
# [('A', 'B' ), ( 'A', 'C'), ( 'B ', 'C')]
heapq
파이썬에서는 힙 기능을 위해 이 라이브러리를 제공한다. heapq는 다익스트라 최단 경로 및 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용된다.
파이썬의 힙은 최소 힙으로 구성되어있어 단순히 원소를 힙에 전부 넣었다가 빼는 것만으로도 시간 복잡도 O(NlogN)에 오름차순 정렬이 완료된다.
힙에 원소를 삽입할 때는 heapq.heappush() 메서드, 꺼내고자 할때는 heapq.heappop() 메서드를 이용한다.
import heapq
def heapsort(iterable):
h = []
result = []
#모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h, value)
#힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for _ in range(len(h)):
result.append(heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
파이썬에서 최대 힙을 사용하려면 원소의 부호를 임시로 변경하는 방식을 사용한다.
힙에 원소를 삽입하기 전에 잠시 부호를 반대로 바꾸었다가, 힙에서 원소를 꺼낸 뒤에 다시 원소의 부호를 바꾸면 된다.
import heapq
def heapsort(iterable):
h = []
result = []
#모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h, -value)
#힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for _ in range(len(h)):
result.append(-heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
bisect
이 라이브러리는 이진탐색을 쉽게 구현할 수 있도록 만들어진 라이브러리로 정렬된 배열에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다.
- bisect_left(a, x) : 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메소드
- bisect_right(a, x) : 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메소드
예를 들어 정렬된 리스트 [1, 2, 4, 4, 8] 이 있을 때, 새롭게 데이터 4를 삽입하려고 가정하자. 이때 bisect_left(a, 4) 와 bisect_right(a, 4)는 각각 인덱스 값으로 2와 4를 반환한다.
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x)) # => 2
print(bisect_right(a, x)) # => 4
또한 이 함수들은 '정렬된 리스트'에서 값이 특정 범위에 속하는 원소의 개수를 구하고자 할 때 효과적으로 사용될 수 있다.
아래 함수는 정렬된 리스트에서 값이 [left_value, right_value]에 속하는 데이터의 개수를 반환한다. 다시 말해 원소의 값을 x라고 할 때, left_value <= x <= right_value의 원소의 개수를 O(logN)으로 빠르게 계산할 수 있다.
from bisect import bisect_left, bisect_right
def count_by_range(a, left_value, right_value):
right_index = bisect_right(a, right_value)
left_index = bisect_left(a, left_value)
return right_index - left_index
a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]
#값이 4인 데이터 개수 출력
print(count_by_range(a, 4, 4) # => 2
#값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3) # => 6
collections
파이썬의 collections 라이브러리는 유용한 자료구조를 제공하는 표준 라이브러리다.
이중 많이 쓰이는 클래스는 deque 와 Counter다.
보통 파이썬에서는 deque를 사용해 큐를 구현한다.

deque에서는 리스트 자료형과 다르게 인덱싱, 슬라이싱 등의 기능은 사용할 수 없다, 다만 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할때는 매우 효과적으로 사용될 수 있다.
deque는 스택이나 큐의 기능을 모두 포함하기 때문에 스택 혹은 큐 자료구조의 대응으로 사용될 수 있다.
deque는 첫 번째 원소를 제거할 때 popleft() 를 사용하며 마지막 원소를 제거할 때 pop()을 사용한다.
또한 첫 번째 인덱스에 원소 x를 삽입할 때 appendleft(x)를 사용하며, 마지막 인덱스에 원소를 삽입할 때 append(x)를 사용한다.
따라서 deque를 큐 자료구조로 이용할 때 원소를 삽입할 때에는 append()를 사용하고 원소를 삭제할 때는 popleft()를 사용하면 된다.
from collections import deque
data =deque([2, 3, 4])
data.appendleft(1)
data.append(5)
print(data) # => deque([1, 2, 3, 4, 5])
print(list(data) # => [1, 2, 3, 4, 5] 리스트 자료형으로 변환
Counter는 등장 횟수를 세는 기능을 제공한다. 구체적으로 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.
from collections import Counter
counter = Counter([ 'red' , 'blue', 'red', 'green' , 'blue', 'blue'])
print(counter['blue']) # => 3
print(counter['green']) # => 1
print(dict(counter)) # => {'red':2, 'blue':3, 'green':1}
Math
팩토리얼, 제곱근, 최대공약수(GCD)등을 게산해주는 기능을 포함하므로 수학 계산을 요구하는 문제를 만났을 때 효과적으로 사용할 수 있다)
math의 factorial(x)함수는 x! 값을 반환한다
import math
print(math.factorial(5)) # 5 팩토리얼을 출력
# => 120
math의 sqrt(x)함수는 x의 제곱근을 출력한다
import math
print(math.sqrt(7)) # => 2.6457513110645907
math의 gcd(a, b) 함수는 a와 b의 최대 공약수를 반환한다.
import math
print(math.gcd(21, 14)) # => 7
수학 공식에 자주 등장하는 상수가 필요할 때도 math를 사용할 수 있다 pi나 e같은 것을 제공한다
import math
print(math.pi) # => 3.141592653589793
print(math.e) # => 2.718281828459045'공부기록 > 알고리즘 공부' 카테고리의 다른 글
| 파이썬 문법 정리 1. <리스트, 문자열, 튜플,딕셔너리,Set> (0) | 2022.05.19 |
|---|---|
| 그리디 알고리즘이란?, 백준 설탕배달 (0) | 2022.04.23 |
| 트리와 힙 (파이썬 네이티브 코드로 구현하기) (0) | 2022.04.21 |
| 1. 알고리즘 공부 배열, 리스트 (파이썬 네이티브 코드로 구현하기) (0) | 2022.03.24 |
| 백준 1927번 <파이썬> (힙에 대해 공부하기) (0) | 2022.03.16 |