기본적인 파이썬 문법이 아닌, 부족하다고 느끼는 문법들을 자유롭게 정리한다.
itertools
는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리로, permutations
, combinations
를 주로 사용한다.
permutations
의 경우 리스트와 같은 iterable
객체에서 r
개의 데이터를 뽑아 일렬로 나열하는 모든 경우를 계산한다.
permutation
는 클래스의 개념이므로, 객체 초기화 이후에는 리스트 자료형으로 변환해 사용한다.
사용 예시는 아래와 같다.
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permuatioins(data, 3))
print(result)
---
[('A', 'B', 'C'), ('B', 'A', 'C'), ('A', 'C', 'B'), ('B', 'C', 'A'), ('C', 'A', 'B') ...]
combinations
는 리스트와 같은 iterable
객체에서 r
개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우를 계산한다.
이 또한 마찬가지로 클래스이여서 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
사용 예시는 아래와 같다.
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
개의 데이터를 뽑아 일렬로 나열하는 모든 경우를 계산한다.
이때, 원소를 중복하여 뽑으며 product
객체를 초기화 할 떄는 뽑고자 하는 데이터의 수를 repeat
속성값으로 넣어준다.
product
역시 클래스이므로, 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.
사용 예시는 아래와 같다.
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') ...]
combinations_with_replacement
는 combinations
와 같이 리스트와 같은 iterable
객체에서 r
개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우를 계산하며, 중복을 허용한다.
combinations_with_replacement
는 클래스여서, 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용해야 한다.
사용 예시는 아래와 같다.
from itertools import combinatons_with_replacment
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')]
주로 우선순위 큐를 구현하기 위해 사용하는 라이브러리로, PriorityQueue
라이브러리보다 더 빠른 성능을 제공한다.
파이썬에서 기본 heap
은 Min heap
으로 구성되어 있어, O(NlogN)
에 데이터의 오름차순 정렬을 완료할 수 있다.
Min heap
에서 최상단 원소는 항상 가장 작은 원소이기 때문에 가능하다.
heap
에 원소를 삽입할 경우 heap.heappush()
메소드를 이용하고 원소를 꺼낼 경우 heap.heappop()
메소드를 이용한다.
아래 예시는 힙 정렬을 수행하는 코드다.
import heapq
def heap_sort(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 = heap_sort([1, 3, 5, 7, 9, 2, 4, 6, 8, 10])
print(result)
---
[1,2,3,4,5,6,7,8,9,10]
파이썬에서 Max heap
은 지원하지 않아, 원소의 부호를 임시로 변경하는 방식을 사용하여 구현한다.
Max heap
을 구현하는 코드는 다음과 같다.
import heapq
def heap_sort(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 = heap_sort([1, 3, 5, 7, 9, 2, 4, 6, 8, 10])
print(result)
---
[10,9,8,7,6,5,4,3,2,1]
이진 탐색을 쉽게 구현할 수 있도록 bisect
라이브러리를 제공한다.
bisect
라이브러리는 정렬된 배열에서 특정 원소를 찾아야할 때 효과적으로 사용할 수 있다.
bisect_left(a, x)
: 정렬된 순서를 유지하면서 리스트a
에 데이터 x
를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
bisect_right(a, x)
: 정렬된 순서를 유지하도록 리스트 a
에 데이터 x
를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
예를 들어, 정렬된 리스트 [1, 2, 4, 4, 8]
이 있을 때, 새로운 데이터 4에 대한 메서드 결과는 다음과 같다.
[1, 2, (bisect_left) 4, 4, (bisect_right) 8]
소스코드는 다음과 같다.
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x)
print(bisect_right(a, x)
---
2
4
두 메소드는 정렬된 리스트에서 값이 특정 범위에 속하는 원소의 개수를 구하고자 할 때 효과적으로 사용된다.
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]
print(count_by_range(a, 4, 4))
print(count_by_range(a, -1, 3))
---
2
6
deque
와 Counter
를 제공하는 라이브러리다.
deque
는 파이썬에서 큐를 구현할 때 사용한다. 리스트와 비교해 시간 복잡도가 O(1)
수준으로 굉장히 빠른 연산이 가능하다.
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)
print(list(data))
---
deque([1,2,3,4,5])
[1,2,3,4,5]
Counter
는 등장 횟수를 세는 기능을 제공한다. 리스트와 같은 iterable
객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는 지를 알려준다.
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(counter['blue'])
print(counter['green'])
print(dict(counter))
---
3
1
{'red':2, 'blue':3, 'green':1}
수학적인 기능을 포함하고 있는 라이브러리로, 팩토리얼, 제곱근, 최대공약수 등을 계산할 떄 사용한다.
factorial(num)
: num!
을 반환한다.
import math
print(math.factorial(5))
---
120
sqrt(num)
: num
의 제곱근을 반환한다.
import math
print(math.sqrt(9))
---
3
gcd(a, b)
: a
와 b
의 최대공약수를 반환한다.
import math
print(math.gcd(14, 21))
---
7
pi
, e
import math
print(math.pi)
print(math.e)
---
3.141592653589793
2.718281828459045