잡다한 파이썬 지식
Enumerate 함수
- enumerate 함수는 순서가 있는 자료형 (list, set, tuple, dictionary, string)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려 줌
- for문과 함께 사용하면 자료형의 현재 순서(index)와 그 값을 쉽게 알 수 있음
l = list(enumerate(input()))
k = []
for j, i in l:
k.append(i)
print(k)
# 응용
graph = []
for _ in range(4):
cnt = list(enumerate(input()))
content = []
for index, data in cnt:
content.append(int(data))
graph.append(content)
print(graph)
이진 탐색 구현을 도와주는 bisect 라이브러리
bisect
라이브러리는 원소들이 정렬된 리스트에서 특정 원소를 찾을 때 효과적임.- bisect_left(list, targetdata): 리스트에 데이터를 삽입할 가장 왼쪽 인덱스를 찾는 함수(리스트 내 정렬 순서를 유지)
- bisect_right(list, targetdata): 리스트에 데이터를 삽입 할 가장 오른쪽 인덱스를 찾는 함수(리스트 내 정렬 순서를 유지)
from bisect import bisect_left, bisect_right
a = [1, 2, 3, 3, 5, 10]
x = 3
print(f"bisect_left : {bisect_left(a, x)}") # 2
print(f"bisect_right : {bisect_right(a, x)}") # 4
bisect_left, bisect_right를 응용하여 원소들이 정렬된 리스트에서 특정 범위 내에 속하는 특정 값의 개수를 구할 때 효과적이며 O(logN)으로 빠르게 계산할 수 있음
from bisect import bisect_left, bisect_right
# [left_v, right_v] 범위 내에 있는 원소 개수 출력 함수
def cnt_within_range (arr, left_v, right_v):
# 맨 좌측 인덱스
left_idx = bisect_left(arr, left_v)
# 맨 우측 인덱스
right_idx = bisect_right(arr, right_v)
return right_idx - left_idx
# 리스트 생성
arr = [5, 6, 7, 7, 7, 7, 8, 8, 9, 10]
# 값이 9인 원소 개수 출력
print(cnt_within_range(arr, 9, 9)) # 1
# [4, 7] 범위 내에 있는 원소 개수 출력
print(cnt_within_range(arr, 4, 7)) # 6
join함수 🚀
-
매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 변환하는 함수이다.
-
함수의 모양은 ‘구분자’.join(리스트)
-
’‘.join([‘a’,’b’,’c’]) 결과는 ‘abc’ 문자열
순열(permutations)
- 순열은 순서를 고려하여 뽑는 경우의 수다.
nPr
- 서로 다른 n개에서 r개를 택하여 일렬로 나열하는 경우의 수
- n!/(n-r)! = nx(n-1)x(n-2)x…x(n-r+1)
예시) 1, 2, 3, 4, 5가 적혀 있는 숫자 카드가 있다. 이를 이용해 세 자리 수를 만들 수 있는 방법은?
- 백은 자리에 올 수 있는 경우의 수 : 5
- 십의 자리에 올 수 있는 경우의 수 : 4
- 일의 자리에 올 수 있는 경우의 수 : 3
따라서 경우의수는 60이다.
itertools 라이브러리에서 permutations함수를 활용한 순열 구현 📃
from itertools import permutations
sets = [1,2,3]
data = itertools.permutation(sets, 2)
for i in data:
print(i)
#print
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
조합(combination) 🚀
- 조합은 순서를 생각하지 않고 뽑는 경우의 수
nCr
- 서로 다른 n개에서 순서를 생각하지 않고 r개를 택하는 경우의 수
- n!/(n-r)!r! = nPr/r! = {n(n-1)(n-2)…(n-r+1)}r!
예시) A,B,C,D,E 5명의 후보가 있다. 이 중 2명의 대표를 뽑는 방법은?
(A,B),(A,C),(A,D),(A,E) (B,C),(B,D),(B,E) (C,D),(C,E) (D,E)
조합은 순서를 생각하지 않으므로 (A,B)와 (B,A)를 같은 것으로 본다. 즉, 순열은 5P2 = 5x4 = 20이지만 조합은 (5x5)/2 = 10 이다.
5C2 = 5P2/(2x1) = (5x4)/(2x1) = 10
itertools 라이브러리에서 combinations함수를 활용한 순열 구현 📃
from itertools import combinations
sets = ['A', 'B', 'C']
data = itertools.combinations(sets, 2)
for i in data:
print(i)
#print
(A, B)
(A, C)
(B, C)
댓글남기기