Python을 사용하면서, 코딩테스트에 도움이 되는 유용한 함수/기능들을 정리하려고 한다.
프로그래머스의 파이썬을 파이썬 답게 강의를 기반으로, 문제를 풀며 알게 된 함수들을 추가로 정리하였다.
자신의 멤버를 한 번에 하나씩 리턴할 수 있는 객체
int 타입 인덱스를 통해 원소에 접근할 수 있는 iterable
함수 인자(arguments)에 사용해서 list 등의 묶여있는 자료구조를 풀어서 전달하는 연산자
l = [1, 2, 3, 4]
print(l) # [1, 2, 3, 4]
print(*l) # 1 2 3 4
s = '가나'
# 왼쪽 정렬
print(s.ljust(5)) # '가나 '
# 오른쪽 정렬
print(s.rjust(5)) # ' 가나'
# 가운데 정렬
print(s.center(5)) # ' 가나 '
import string
# 알파벳 lowercase
print(string.ascii_lowercase) # 'abcdefghijklmnopqrstuvwxyz'
# 알파벳 uppercase
print(string.ascii_uppercase) # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 알파벳 전부
print(string.ascii_letters) # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 숫자
print(string.digits) # '0123456789'
stack 또는 queue가 필요할 때 유용
from collections import deque
# stack 처럼 사용
stack = deque()
stack.append(1)
stack.append(2)
print(list(stack)) # [1, 2]
stack.pop()
print(list(stack)) # [1]
# queue 처럼 사용
queue = deque()
queue.append(1)
queue.append(2)
print(list(queue)) # [1, 2]
queue.popleft()
print(list(queue)) # [2]
dict를 상속받는 클래스로, 개수를 셀 때 유용
from collections import Counter
mystr = 'aabbc'
d = Counter(mystr)
print(d) # Counter({'a': 2, 'b': 2, 'c': 1})
# 출력 결과 : a b c
for key in d.keys():
print(key, end=' ')
print()
# 출력 결과 : 2 2 1
for value in d.values():
print(value, end=' ')
print()
# 출력 결과 : a: 2 b: 2 c: 1
for key, value in d.items():
print(f'{key}: {value}', end=' ')
print()
priority queue 또는 heap이 필요할 때 유용
기본은 작은 값이 우선순위가 높은 최소힙(min-heap)
import heapq
l = []
# 힙 방식으로 삽입. 첫 번째 인자 list, 두 번째 인자 삽입할 item
heapq.heappush(l, 1)
heapq.heappush(l, 4)
heapq.heappush(l, 2)
# 힙 방식으로 삭제. heappop할 list를 인자로 전달
print(heapq.heappop(l)) # 1
print(heapq.heappop(l)) # 2
print(heapq.heappop(l)) # 4
h = [5, 2, 3, 6, 1]
# 힙이 아닌 list를 힙으로 만들기. 힙으로 만들 list를 인자로 전달
heapq.heapify(h)
print(heapq.heappop(h)) # 1
print(heapq.heappop(h)) # 2
print(heapq.heappop(h)) # 3
print(heapq.heappop(h)) # 5
print(heapq.heappop(h)) # 6
여러 개의 iterable을 이어서 하나의 iterable로 만드는 함수
from itertools import chain
print(list(chain([1, 2, 3, 4], [5, 6, 7, 8]))) # [1, 2, 3, 4, 5, 6, 7, 8]
iterable의 product(데카르트 곱)를 구하는 함수
from itertools import product
A = 'ABCD'
x = 'xy'
print(list(product(A, x)))
# [('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y'), ('C', 'x'), ('C', 'y'), ('D', 'x'), ('D', 'y')]
iterable의 permutation(순열)을 구하는 함수
from itertools import permutations
print(list(permutations(['1', '2', '3'])))
# [('1', '2', '3'), ('1', '3', '2'), ('2', '1', '3'), ('2', '3', '1'), ('3', '1', '2'), ('3', '2', '1')]
iterable의 combination(조합)을 구하는 함수
첫 번째 인자로 iterable, 두 번째 인자로 뽑을 개수 전달
from itertools import combinations
print(list(cominations(['1', '2', '3'], 2)))
# [('1', '2'), ('1', '3'), ('2', '3')]
a를 b로 나눈 몫과 나머지를 반환하는 함수
단, 작은 숫자는 그냥 a//b, a%b를 쓰는 게 더 빠르다고 한다.
print(divmod(5, 3)) # (1, 2)
any는 iterable 객체를 받아서 그 객체를 돌며 True가 하나라도 있으면 True를 반환하는 함수이다.
print(any([True, False, False])) # True
print(any([False, False, False])) # False
all은 iterable 객체를 받아서 그 객체의 모든 요소가 True일 때만 True를 반환하는 함수이다.
print(all([True, True, True])) # True
print(any([True, True, False])) # False
zip은 여러 개의 iterable을 인자로 받아서 각 iterable의 iterator 묶음을 가져오는 함수이다. 여러 iterable을 동시에 순회할 때 사용하면 유용하다.
zip에 인자로 넘겨지는 iterable의 길이가 다르면 짧은 것을 기준으로 순회 후 종료한다.
answer = []
mylist = [2, 6, 4, 8, 1]
for n1, n2 in zip(mylist, mylist[1:]):
answer.append(abs(n1-n2))
print(answer) # [4, 2, 4, 7]
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(list(map(list, zip(*mylist))) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# 원리 이해
print(list(zip(*mylist))) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
import itertools
mylist = [[1, 2], [3, 4]]
# 1
print(sum(mylist, [])) # [1, 2, 3, 4]
# 2
print(list(itertools.chain(*mylist)) # [1, 2, 3, 4]
기본적인 정렬 방법은 list.sort() 함수를 사용하는 방법, sorted() 내장함수를 사용하는 방법 2가지가 있다.
sort() 함수는 list에만 있는 메서드다.sort() 함수는 원본 list 자체를 정렬된 상태로 변경시킨다.sorted() 함수는 iterable이면 모두 정렬 가능하다.sorted() 함수는 iterable을 정렬한 list를 반환한다.l = [-1, 5, 0, 2, 4]
l.sort()
print(l) # [-1, 0, 2, 4, 5]
l2 = [-4, 0, 6, 8, 2]
print(sorted(l2))
l = [(0, 2), (5, -4), (-1, 2), (0, 1), (7, 1)]
# 기본적으로 앞의 element -> 뒤의 element의 오름차순으로 정렬
print(sorted(l)) # [(-1, 2), (0, 1), (0, 2), (5, -4), (7, 1)]
# 2번째 element를 기준으로 정렬
print(sorted(l, key=lambda x: x[1])) # [(5, -4), (0, 1), (7, 1), (0, 2), (-1, 2)]
from operator import itemgetter
l = [(0, 2), (5, -4), (-1, 2), (0, 1), (7, 1)]
# 1번 element를 기준으로 정렬하고, 1번 element가 같으면 0번 element를 기준으로 정렬
print(sorted(l, key=itemgetter(1, 0))) # [(5, -4), (0, 1), (7, 1), (-1, 2), (0, 2)]
words = [ 'i', 'am', 'a', 'Student' ]
# decorate
decorated = [ (len(word), word) for word in words ]
# sort
decorated.sort()
# undecorate
sorted_words = [ word for _, word in decorated ]
print(sorted_words) # ['a', 'i', 'am', 'Student']