파이썬: 주요 라이브러리 활용

jaylight·2021년 2월 23일
0
post-custom-banner
  • 표준 라이브러리: 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리

내장 함수

  • print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함
  • import 없이 사용 가능

sum()

  • iterable 객체가 입력으로 주어졌을 때, 모든 원소의 합을 반환
result = sum([1, 2, 3, 4, 5])
print(result) # 15

min()

  • 2개 이상의 파라미터에서 가장 작은 값을 반환
result = min(7, 3, 5, 2)
print(result)

max()

  • 2개 이상의 파라미터에서 가장 큰 값을 반환
result = max(7, 3, 5, 2)
print(result)

eval()

  • 수학 수식이 문자열 형식으로 들어오면, 해당 수식을 계산한 결과를 반환
result = eval("(3 + 5) * 7")
print(result)

sorted()

  • iterable 객체가 들어왔을 때, 정렬된 결과를 반환
  • key 속성으로 정렬 기준을 명시할 수 있으며, reverse 속성으로 정렬된 결과를 뒤집을지 여부를 결정
result = sorted([9, 1, 8, 5, 4])
print(result) # [1, 4, 5, 8, 9]

#reverse
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)]

sort()
iterable 객체는 기본으로 sort() 함수를 내장하고 있으며, sort() 함수는 리스트 객체의 내부 값이 정렬된 값으로 바로 변경되는 특징이 있음

itertools

  • 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리
  • 순열(permutations), 조합(combinations) 등의 라이브러리를 제공

permutations() (순열)

  • iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산
  • permutations = class, 따라서 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
# ['A', 'B', 'C']에서 3개를 뽑아 나열하는 모든 경우
from itertools import permutations

data = ['A', 'B', 'C']

result = list(permutations(data, 3))

print(result) # [('A', 'B', 'C'), ('A', 'C', 'B'), ... , ('C', 'B', 'A')]

combinations() (조합)

  • iterable 객체에서 r개의 데이터를 뽑아 순서 상관 없이 나열하는 모든 경우(조합)를 계산
  • combinations = class, 따라서 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
# ['A', 'B', 'C']에서 2개를 뽑아 순서 상관 없이 나열하는 모든 경우
from itertools import combinations

data = ['A', 'B', 'C']

result = list(combinations(data, 2))

print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]

product() (중복을 허용한 순열)

  • iterable 객체에서 r개의 데이터를 뽑아 순서 상관 없이 나열하는 모든 경우(조합)를 계산하며, 원소를 중복으로 추출할 수 있음
  • product 객체 초기화시, 뽑고자 하는 데이터 수를 repeat 속성 값으로 넣어줌
  • product = class, 따라서 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
# ['A', 'B', 'C']에서 중복을 포함하여 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'), ..., ('C', 'C')]

combinations_with_replacement() (중복을 허용한 조합)

  • iterable 객체에서 r개의 데이터를 뽑아 순서 상관 없이 나열하는 모든 경우(조합)를 계산, 원소를 중복으로 추출할 수 있음
  • combinations_with_replacement = class, 따라서 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
# ['A', 'B', 'C']에서 중복을 포함하여 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')]

heapq

  • heap 기능을 위한 라이브러리, 우선순위 큐 기능을 구현하기 위해 사용
  • 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용

파이썬의 힙(Heap)

  • 최소 힙으로 구성되어 있으므로 단순히 원소를 힙에 전부 넣었더가 빼는 것만으로도 시간 복잡도 O(NlogN)에 오름차순 정렬이 완료
  • 보통 최소 힙 자료구조의 최상단 원소는 항상 '가장 작은' 원소이기 때문

heappush() & heappop()

  • heapq.heappush(): 힙에 원소를 삽입
  • heapq.heappop(): 힙에서 원소를 추출

heap sort 구현하기

import heapq

def heapsort(iterable):
    h = []
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
    	heapq.heappush(h, value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    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]

Max heap 구현하기

  • 힙에 원소를 삽입할 때, 잠시 원소의 부호를 임시로 변경하는 방식을 사용
  • 힙에서 원소를 꺼낸 뒤 다시 원소의 부호를 바꿈
# 최대 힙을 구현하여 내립차순 힙 정렬 구현
import heapq

def heapsort(iterable):
    h = []
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
    	heapq.heappush(h, -value)
    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]

bisect

  • 이진 탐색(Binary Search) 기능을 제공하는 라이브러리
  • 정렬된 배열에서 특정 원소를 찾아야 할 때 매우 효과적으로 사용

bisect_left(a, x) & bisect_right(a, x)

  • bisect_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
  • bisect_right(a, x): 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
  • 정렬된 리스트 a= [1, 2, 4, 4, 8] 에서 새롭게 데이터 4를 삽입할 때,
from bisect import bisect_left, bisect_right

bisect_left(a, 4) = 2
bisect_right(a, 4) = 4
  • 정렬된 리스트에서 값이 특정 범위에 속하는 원소의 개수를 구하고자 할 때 효과적으로 사용
from bisect import bisect_left, bisect_right

# 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수
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))

# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3))

collections

deque

  • 큐 자료구조를 구현하는 라이브러리

Queue 라이브러리가 있지만, 일반적인 큐 자료구조 구현 라이브러리가 아니므로, deque를 사용

  • 리스트 자료형과 다르게 인덱싱, 슬라이싱 기능은 사용할 수 없지만, 연속적으로 나열된 데이터 시작과 끝에 데이터를 삽입하거나 삭제할 때 매우 효과적으로 사용
  • 스택, 큐의 기능을 모두 포함한다고 볼 수 있기 때문에, 스택 혹은 큐 자료 구조 대용으로도 사용

deque.popleft(), deque.pop()

  • deque.popleft(): 첫 번째 원소를 제거
  • deque.pop(): 마지막 원소를 제거

deque.appendleft(), deque.append()

  • deque.appendleft(): 첫 번째 인덱스에 원소를 삽입
  • deque.append(): 마지막 인덱스에 원소를 삽입

맨 앞에 자료를 추가하거나 제거할 때, 리스트의 경우 시간복잡도는 O(N)인 반면 deque는 O(1)이다. 따라서 앞 쪽에 많은 양의 원소를 추가하고 제거한다면 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', 'green', 'blue', 'blue'])

print(counter['blue']) # 3
print(counter['green']) # 1
print(dict(counter))
{'red': 2, 'blue': 3, 'green': 1}

Counter 객체 끼리는 딕셔너리와 다르게 Key를 기준으로 사칙연산이 가능하다.

math

  • 자주 사용되는 수학적 기능을 포함하고 있는 라이브러리
  • 팩토리얼, 제곱근, 최대공약수 등을 계산해주는 기능을 포함

factorial() (팩토리얼)

  • 인자의 팩토리얼 값 (factorial(x)의 경우, x!)을 반환
import math

print(math.factorial(5)) # 120

sqrt() (제곱근)

  • 인자의 제곱근 (sqrt(x)의 경우, x의 제곱근)을 반환
import math

print(math.sqrt(7)) # 2.6457513110645907

소수점 자리 조정은 round() 함수를 활용

import math
print(round(math.sqrt(7), 2)) # 2.65
  • 올림은 ceil(), 내림은 floor()을 활용

gcd(a, b) (최대 공약수)

  • a와 b의 최대 공약수를 반환
import math

print(math.gcd(21, 14)) # 7

pi, e

  • 파이아 자연상수 e를 제공
import math

print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
post-custom-banner

0개의 댓글