본문 바로가기
Programming/Python

[Python library] Itertools - 순열과 조합( Permutation, Combination )

by jionee 2020. 10. 21.
SMALL

Itertools : 효율적인 반복을 위한 모듈

무한 반복자

Iterator Arguments Results Example
count() start, [step] start, start+step, start+2*setp, … count(10) -> 10 11 12 13 14 ...
cycle() p p0, p1, …plast, p0, p1, … cycle('ABCD') -> A B C D A B C D ...
repeat() elem [,n] elem, elem, elem, …
무한 반복, 혹은 최대 n번
repeat(10, 3) -> 10 10 10

 

가장 짧은 입력 시퀀스에서 종료되는 반복자

Iterator Arguments Results Example
accumulate() p [,func] p0, p0+p1, p0+p1+p2, … accumulate([1,2,3,4,5]) -> 1 3 6 10 15
chain() p, q, … p0, p1, … plast, p0, p1, … chain('ABC', 'DEF') -> A B C D E F
chain.from_iterable() iterable p0, p1, … plast, p0, p1, … chain.from_iterable(['ABC','DEF']) -> A B C D E F
compress() data, seletors (d[0] if s[0]), (d[1] if s[1]), … compress('ABCDEF', [1,0,1,0,1,1]) -> A C E F
dropwhile() pred, seq pred가 실패할때 시작되는 seq[n], seq[n+1] dropwhile(lambda x: x<5, [1,4,6,4,1]) -> 6 4 1
filterfalse() pred, seq pred(elem)가 false인 seq의 element filterfalse(lambda x: x%2, range(10)) -> 0 2 4 6 8
groupby() iterable[,key] key(v)의 값으로 그룹화된 하위 반복자  
islice() seq, [start,] stop [,step] seq의 요소 [start:stop:step] islice('ABCDEFG', 2, None) -> C D E F G
starmap() func, seq func(seq[0]), func(seq[1]),… starmap(pow, [(2,5), (3,2), (10,3)]) -> 32 9 1000
takewhile() pred, seq seq[0], seq[1], pred가 실패할때까지 takewhile(lambda x: x<5, [1,4,6,4,1]) -> 1 4
tee() it, n it1, it2, … 하나의 반복자를 n으로 나눔  
zip_longest() p, q, … (p[0], q[0]), (p[1], q[1]), … zip_longest('ABCD', 'xy', fillvalue='-') -> Ax By C- D-

 

조합 반복자

Iterator Arguments Results Example
product() p, q, …
[repeat=1]
중첩된 for 루프와 동등한 cartesian product(데카르트 곱) product('ABCD', repeat=2) -> AA AB AC AD BA BB BC .... DA DB DC DD
permutations() p[, r] r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음 permutations('ABCD', 2) -> AB AC AD BA BC BD CA CB CD DA DB DC
combinations() p, r r-길이 튜플들, 정렬된 순서, 반복되는 요소 없음 combinations('ABCD', 2) -> AB AC AD BC BD CD
combinations_with_replacement() p, r r-길이 튜플들, 정렬된 순서, 반복되는 요소 있음 combinations_with_replacement('ABCD', 2) -> AA AB AC AD BB BC BD CC CD DD

 

예 )

product('ABCD', repeat=2)

AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD

permutations('ABCD', 2)

AB AC AD BA BC BD CA CB CD DA DB DC

combinations('ABCD', 2)

AB AC AD BC BD CD

combinations_with_replacement('ABCD', 2)

AA AB AC AD BB BC BD CC CD DD

 

순열 permutation

서로 다른 n개 중 r개를 골라 순서를 정해 나열하는 가짓수 (nPr로 표시)

 

ex)  [A, B, C]의 리스트에서 2개의 원소를 골라 순서를 정해 나열

-> [(A, B), (A, C), (B, A), (B, C), (C, A), (C, B)]

* 즉, 순열에서는 (A, B)와 (B, A)는 다른 것이다.

 

 

permutations(반복 가능한 객체, r)

import itertools

arr = ['A', 'B', 'C']
nPr = itertools.permutations(arr, 2)
print(list(nPr))


결과 : [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

 

 

 

조합 combination

서로 다른 n개 중에서 r개(n≥r)를 골라 조를 만들어 나열하는 가짓수 (nCr로 표시)

순서 고려 X

ex) [A, B, C]의 리스트에서 2개의 원소를 골라 나열
 -> [(A, B), (A, C), (B, C)] 가 나오게 된다.

* 즉, 조합은 (A, B)와 (B, A)는 같은 것으로 취급한다.

 

 

combinations(반복 가능한 객체, r)

import itertools

arr = ['A', 'B', 'C']
nCr = itertools.combinations(arr, 2)
print(list(nCr))

 

결과 : [('A', 'B'), ('A', 'C'), ('B', 'C')]

 

 

 

중복 순열 product

서로 다른 n개 중 중복을 허용해 r개를 골라 순서를 정해 나열하는 가짓수  (n∏r로 표시)

 

 

 

product(반복 가능한 객체, repeat=1)

import itertools

for i in product([1,2,3], repeat=2):
    print(i, end=" ")

결과 : (1, 1) (1, 2) (1, 3) (2, 1) (2, 2) (2, 3) (3, 1) (3, 2) (3, 3)

 

 

 

중복 조합 combinations_with_replacement

서로 다른 n개 중에서 중복을 허용해 r개(n≥r)를 골라 조를 만들어 나열하는 가짓수 (nHr로 표시)

 

combinations_with_replacement(반복 가능한 객체, r)

import intertools

for cwr in combinations_with_replacement([1,2,3,4], 2):
    print(cwr, end=" ")

결과 : (1, 1) (1, 2) (1, 3) (1, 4) (2, 2) (2, 3) (2, 4) (3, 3) (3, 4) (4, 4)

 

'Programming > Python' 카테고리의 다른 글

[Algorithm] Python : DFS와 BFS  (0) 2020.11.03

댓글