컴공생 누르지 마세요! 컴공생 울어요.
[Python 문법 공부] 04. 주요 라이브러리 본문
1. 내장함수
- 별도의 import 명령어 없이 바로 사용할 수 있음
- input(), print() 입출력 함수 제공
함수명 | 기능 | 예시 코드 |
sum() | iterable 객체가 입력으로 주어졌을 때, 모든 원소의 합 반환 | result = sum([1, 2, 3, 4, 5]) |
min() | 파라미터가 2개 이상 들어왔을 때 가장 작은 값 반환 | result = min(7, 3, 5, 2) |
max() | 파라미터가 2개 이상 들어왔을 때 가장 큰 값 반환 | result = max(7, 3, 5, 2) |
eval() | 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과 반환 | result = eval("(3 + 5) * 7") |
sorted() | iterable 객체가 들어왔을 때 정렬된 결과 반환 key 속성으로 정렬 기준 명시 가능 reverse 속성으로 역순 정렬도 가능 |
# 오름차순 정렬 result = sorted([9, 1, 8, 5, 4]) # 내림차순 정렬 result = sorted([9, 1, 8, 5, 4], reverse = True) # 리스트의 원소가 리스트나 튜플일 경우 # key 속성으로 정렬 가능 result = sorted([('홍길동', 35), ('이순신', 75), ('아무개', 50)], key = lambda x: x[1], reverse = True) |
iterable 객체는 기본적으로 sort() 함수 내장 바로 정렬된 값으로 변경됨 (sorted() 굳이 쓸 필요 X) |
data = [9, 1, 8, 5, 4] data.sort() # 오름차순 정렬 |
* iterable 객체: 반복가능한 객체. 리스트, 사전, 튜플 등
2. Itertools
- 반복되는 데이터를 처리하는 기능 포함
- 대표적으로 순열, 조합 관련 클래스 존재
permutations
- iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해줌
- 객체 초기화 이후 리스트 자료형으로 변환 필요
- 리스트 ['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', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
combinations
- iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)를 계산해줌
- 객체 초기화 이후 리스트 자료형으로 변환 필요
- 리스트 ['A', 'B', 'C']에서 2개 (r=2)를 뽑아 나열하는 모든 경우를 출력하는 예시 코드
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2))
print(result)
# 실행결과: [('A', 'B'), ('A', 'C'), ('B', 'C')]
product
- permutations와 같이 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해줌
- 다만, 원소를 중복하여 뽑음
- 뽑고자 하는 데이터의 수를 repeat 속성값으로 넣어줌
- 리스트 ['A', 'B', 'C']에서 중복을 포함하여 2개 (r=2)를 뽑아 나열하는 모든 경우를 출력하는 예시 코드
from itertools import product
data = ['A' , 'B', 'C']
result = list(product(data, repeat = 2))
print(result)
# 실행결과:
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
combinations_with_replacement
- combinations와 같이 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)를 계산해줌
- 다만, 원소를 중복하여 뽑음
- 리스트 ['A', 'B', 'C']에서 중복을 포함하여 2개 (r=2)를 뽑아 순서에 상관없이 나열하는 모든 경우를 출력하는 예시 코드
from itertools import combinations_with_replacement
data = ['A' , 'B', 'C']
result = list(combinations_with_replacement(data, 2))
print(result)
# 실행결과:
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
3. heapq
- 힙 Heap 기능을 위해 제공되는 라이브러리
- 우선순위 큐 기능을 구현할 때 사용
- 파이썬의 힙은 최소 힙 (min Heap)으로 구성 ➡️ 오름차순 정렬 시간복잡도가 O(NlogN)
- 최소 힙: key(부모노드) <= key(자식노드) 이므로 루트 원소는 항상 최솟값
- heapq.heappush()
- 힙에 원소 삽입
- heapq.heappop()
- 힙에서 원소를 꺼냄
- 최소힙을 이용한 오름차순 힙정렬을 heapq로 구현하는 예시 코드
import heapq
def heapsort(iterable):
h = [] # 최소 힙
result = [] # 결과 리스트
# 모든 원소를 차례대로 힙에 삽입
for i in iterable:
heapq.heappush(h, i)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i 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]
- heapq 라이브러리를 이용하여 최대 힙 구현 가능
- 힙에 원소를 삽입하기 전에 잠시 부호를 바꾸었다가, 꺼낸 뒤 다시 원소의 부호를 바꿔주기
- 최대힙을 이용한 내림차순 힙정렬 구현 예시 코드
import heapq
def heapsort(iterable):
h = [] # 최소 힙
result = [] # 결과 리스트
# 모든 원소를 차례대로 힙에 삽입
for i in iterable:
heapq.heappush(h, -i)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i 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]
4. bisect
- 정렬된 배열에서 특정한 원소를 찾는 이진탐색을 쉽게 구현할 수 있도록 하는 라이브러리
- 대표적인 함수는 다음과 같음
함수 | 기능 |
bisect_left(a, x) | 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드 |
bisect_right(a, x) | 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드 |
- 정렬된 리스트 [1, 2, 4, 4, 8]에 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
- 정렬된 리스트에서 값이 특정 범위에 속하는 원소의 개수를 구할 때 효과적으로 사용 가능
- 예시코드 속 count_by_range(a, left_value, right_value) 함수
- left_value <= x <= right_value인 원소의 개수를 O(logN)으로 계산 가능
- 예시코드 속 count_by_range(a, left_value, right_value) 함수
from bisect import bisect_left, bisect_right
def count_by_range(a, left_value, right_value):
left_idx = bisect_left(a, left_value)
right_idx = bisect_right(a, right_value)
return right_idx - left_idx
a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]
print(count_by_range(a, 4, 4,))
# 실행결과: 2
print(count_by_range(a, -1, 3))
# 실행결과: 6
5. collections
- 유용한 자료구조를 제공하는 표준 라이브러리
- 대표적으로 deque, Counter 존재
deque
- 큐 구현 시 사용
- 기본 리스트 자료형은 원소 삽입 및 삭제가 '가장 뒤쪽 원소'를 기준으로 수행 ➡️ 앞쪽 원소 처리 시 많은 시간 소요
리스트 | deque | |
가장 앞쪽에 원소 추가 | O(N) | O(1) |
가장 뒤쪽에 원소 추가 | O(1) | O(1) |
가장 앞쪽에 있는 원소 제거 | O(N) | O(1) |
가장 뒤쪽에 있는 원소 제거 | O(1) | O(1) |
- deque에서는 인덱싱, 슬라이싱 기능 제공 X
- 그래도 시작 부분이나 끝 부분에 데이터 삽입 및 삭제 시 매우 효과적
- 스택이나 큐의 기능을 모두 포함 ➡️ 스택 & 큐 자료구조의 대용
- deque의 함수 종류
함수 | 기능 |
popleft() | 첫 번째 원소 제거 |
pop() | 마지막 원소 제거 |
appendleft(x) | 첫 번째 인덱스에 원소 x 삽입 |
append(x) | 마지막 인덱스에 원소 x 삽입 |
➡️deque를 큐 자료구조로 이용할 경우, 원소 삽입 시 append(), 원소 삭제 시 popleft() 사용
- deque 사용 예시 코드
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', 'blue', 'green', 'blue'])
print(counter['red']) # 실행결과: 2
print(counter['blue']) # 실행결과: 3
print(counter['green']) # 실행결과: 1
print(dict(counter))
# 실행결과: {'red': 2, 'blue': 3, 'green': 1}
6. math
- 수학적인 기능을 포함하고 있는 라이브러리
- 대표적으로 팩토리얼, 제곱근, 최대공약수 (GCD) 제공
함수 | 기능 | 예시코드 |
factorial(x) | x! (= x * (x - 1) * ... * 2 * 1) 값을 반환 | import math print(math.factorial(5)) # 실행결과: 120 |
sqrt(x) | x의 제곱근을 반 | import math print(math.sqrt(7)) # 실행결과: 2.6457513110645907 |
gcd(a, b) | a와 b의 최대공약수를 반환 | import math print(math.gcd(21, 14)) # 실행결과: 7 |
- 파이 (pi) & 자연상수 e 와 같은 상수도 제공
import math
print(math.pi)
# 실행결과: 3.141592653589793
print(math.e)
# 실행결과: 2.718281828459045
'STUDY > Python' 카테고리의 다른 글
[Python 문법 공부] 05. 스택 & 큐 & 그래프 (0) | 2023.03.11 |
---|---|
[Python 문법 공부] 03. 입출력 (0) | 2023.03.06 |
[Python 문법 공부] 02. 함수 (0) | 2023.03.06 |
[Python 문법 공부] 01. 자료형 - 집합 자료형 (0) | 2023.03.02 |
[Python 문법 공부] 01. 자료형 - 사전 자료형 (0) | 2023.03.02 |
Comments