- 순열/조합 itertools.permutations() .combinations()
- 재귀 sys.setrecursionlimit()
- 정렬 functools.cmp_to_key()
- 힙 heapq
- 누적 계산 functools.reduce()
- 딕셔너리 collections.defaultdict(), collections.Counter()
-
itertools
는 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리이다.itertools.permutations(iterable, r=None) # 순열 튜플들 반환 itertools.combinations(iterable, r) # 조합 튜플들 반환
- 파이썬의 기본 재귀 깊이 제한은
1000
밖에 되지 않고, 이를 초과하면런타임에러
가 발생한다. - 따라서 파이썬 재귀 문제 풀이시 아래와 같이 재귀 깊이 제한을 풀어주어야한다.
sys.setrecursionlimit(10**6)
- sorted()같은 정렬 함수의 key 매개변수로
비교 함수(comparison function)
를 사용할 수 있게 한다. - 비교함수는 우선순위가 높은게 앞에 있으면
-1
, 같으면0
, 우선순위가 낮은게 앞에있으면1
을 리턴하는 함수이다. - 정의한 비교 함수를 cmp_to_key()의 인자로 넣으면, 반복해서 두 요소를 선택하고 우선순위를 비교하여
1
리턴시 두 요소의 위치를 바꾼다. -
result = sorted(src, key=functools.cmp_to_key(xy_compare))
- heapq는 이진트리 기반
최소 힙
자료구조를 제공하여 최대, 최솟값을 반복해서 구해야할 때 유용하다. 최대 힙
으로 사용하는 방법은, 값을 넣을 때 -1을 곱하여 우선순위를 매기는 것이다.ex
5
를(-5,5)
로 푸시하면, 튜플의 앞 인덱스를 우선으로 정렬하므로-5
로 우선순위를 판단한다.-
from heapq import heappush, heappop, heapify heap = [] # 새로운 heap은 그냥 리스트로 만들면 된다. heappush(heap, 5) heappop(heap) # 5 heap = heapify([2,3,6]) # 기존 배열을 사용하려면 heapify()
- 데이터를 순회하며 원하는 형태의 누적 값을 만들 수 있다.
- reduce(집계함수, 순회 가능한 데이터, 초기값 option ) 의 형태이다.
-
# numbers의 모든 값을 더하는 코드. acc는 누적된 값, cur는 현재 값이다. total = reduce(lambda acc, cur: acc + cur, numbers, 0)
-
collections
는 다양한 데이터 구조(list, tuple, dict 등)의 확장된 기능을 주기 위해 제작된 파이썬 내장 모듈이다.-
defaultdict
는 존재하지 않는 키를 조회할 경우, 에러 메시지를 출력하는 대신 디폴트 값을 기준으로 해당 키에 대한 딕셔너리 아이템을 생성해준다. -
딕셔너리라면 KeyError가 발생하겠지만, defaultdict 객체는 에러 없이 바로 +1 연산이 가능하고, 이 경우 디폴트인 0을 기준으로 자동으로 생성한 후 여기에 1을 더해 최종적으로 1이 만들어진다. 이외에도 defaultdict(list)와 같은 형태로 특정 key가 딕셔너리에 있는지 확인하지 않는 숏코딩 역시 가능하게 한다.
from collections import defaultdict >>>from collections import defaultdict >>>a = defaultdict(int) >>>a['A'] = 5 >>>a['B'] = 4 >>>a defaultdict(<class 'int'>, {'A': 5, 'B': 4}) >>>a['C'] += 1 >>>a defaultdict(<class 'int'>, {'A': 5, 'B': 4, 'C': 1}) >>>b = defaultdict(list) >>>b['A'].append(1) >>>b['B'].append(2) >>>b defaultdict(<class 'list'>, {'A': [1], 'B': [2]})
-
Counter
는 중복된 데이터가 저장된 배열을 인자로 넘기면 각 원소가 몇 번씩 나오는지 저장된 객체를 얻게 된다.from collections import Counter >>>Counter(["jamin", "dain", "dain", "jamin", "hyucksoon"]) Coumter({'jamin':2, 'dain':2, 'hyucksoon':1}) >>>Counter("jamin") Counter({'j':1, 'a':1, 'm':1, 'i':1, 'n':1}) #most_common() -> 오름차순 정렬! data = [1, 2, 3, 1, 2, 3, 1, 2, 1, 1, 2] counter = Counter(data) print(counter.most_common()) 출력: [(1, 5), (2, 4), (3, 2)] print(counter.most_common(1)) 출력: [(1, 5)]
-