🌈 프로그래밍/Python

[ Python ] 유용한 라이브러리 정리

반응형

itertools

  • 반복되는 형태의 데이터 처리에 유용
  • 특히 순열과 조합 라이브러리가 유용함.

 

순열

  • 서로 다른 n개에서 서로 다른 r개를 뽑아 순서대로 나열
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')]

중복 순열

from itertools import product

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

result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용)
print(result) 
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), 
# ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]

 

조합

  • 서로 다른 n개에서 순서에 상관없이 r개를 선택
from itertools import combinations

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

result = list(combinations(data, 2))
print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]

중복 조합

from itertools import combinations_with_replacement

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

result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기 (중복 허용)
print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

 

heapq

  • 힙 자료구조 제공
  • 우선순위 큐 기능 구현을 위해 사용

 

bisect

  • 이진 탐색 기능 제공

 

collections

  • deque(덱), counter(카운터) 등의 자료구조 포함

 

counter

  • 등장 횟수를 세는 기능
  • 리스트와 같이 반복 가능한 객체에서 내부 원소가 몇 번씩 등장했는지 알려줌
from collections import Counter

counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue', 'blue'])

print(counter['blue'])  # 4
print(counter['red'])   # 2
print(counter['green']) # 1
print(dict(counter)) # dict로 자료형 변환! {'red': 2, 'blue': 4, 'green': 1}

 

math

  • 필수적인 수학적 기능
  • 팩토리얼, 제곱근, GCD, pi...

 

자주 사용되는 내장 함수

  • eval() : 문자열의 수식을 계산해버림
result = eval("(3+5)*7")
print(result) # 56

 

  • sorted() : 반복 가능한 객체에 대한 정렬 수행
result = sorted([9, 1, 3, 5, 2, 7])
reverse_result = sorted([9, 1, 3, 5, 2, 7], reverse=True) # 내림차순
print(result) # [1, 2, 3, 5, 7, 9]
print(reverse_result) # [9, 7, 5, 3, 2, 1]

 

표준 입출력

# input() : 한 줄의 문자열을 input
# map() : list의 모든 원소에 각각 특정 func apply

# 예시) 학생들의 점수가 공백을 기준으로 한 줄로 입력이 들어온다.
list(map(int, input().split()))

# 예시-1) 마찬가지로 공백을 기준으로 한 줄로 입력되어지는데 개수가 적을 때
# unpacking <- packing
a, b, c = map(int, input().split())

# map(int, ... ) 를 하는 이유 ?
# => 입력을 문자열로 받기 때문에

# more faster
import sys

# 한줄 입력 빠르게
data = sys.stdin.readline().rstrip()
print(data)

# f-string sample
answer = 7
# print("The answer is .. " + str(answer))
print(f"The answer is .. {answer}")

 

Lambda

array = [('홍길동', 50), ('김영희', 87), ('이철수', 90)]

# 정렬 기준을 lambda 함수로..
print(sorted(array, key=lambda x : x[0])) # 이름순 정렬

print(sorted(array, key=lambda x : x[1])) # 점수순 정렬

# [('김영희', 87), ('이철수', 90), ('홍길동', 50)]
# [('홍길동', 50), ('김영희', 87), ('이철수', 90)]

# 여러 리스트에서 lambda 표현식
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]

result = map(lambda a, b: a + b, list1, list2)
print(list(result)) # [7, 9, 11, 13, 15]
반응형