Python 문법

GGob2._.·2023년 4월 10일
0

algorithm

목록 보기
1/55
post-thumbnail

기본적인 파이썬 문법이 아닌, 부족하다고 느끼는 문법들을 자유롭게 정리한다.


itertools library

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')]

productpermutations와 같이 리스트와 같은 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_replacementcombinations와 같이 리스트와 같은 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')]

heapq

주로 우선순위 큐를 구현하기 위해 사용하는 라이브러리로, PriorityQueue 라이브러리보다 더 빠른 성능을 제공한다.

파이썬에서 기본 heapMin 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 라이브러리는 정렬된 배열에서 특정 원소를 찾아야할 때 효과적으로 사용할 수 있다.

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

Collections

dequeCounter를 제공하는 라이브러리다.

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}

math

수학적인 기능을 포함하고 있는 라이브러리로, 팩토리얼, 제곱근, 최대공약수 등을 계산할 떄 사용한다.

factorial(num) : num!을 반환한다.

import math

print(math.factorial(5))

---
120

sqrt(num) : num의 제곱근을 반환한다.

import math

print(math.sqrt(9))

---
3

gcd(a, b) : ab의 최대공약수를 반환한다.

import math

print(math.gcd(14, 21))

---
7

pi, e

import math

print(math.pi)
print(math.e)

---
3.141592653589793
2.718281828459045
profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글