pythonic tools - Combinatoric iterators

1 minute read

itertools에는 순열과 조합에 관련된 결과를 뱉는 iterators 또한 구현되어 있다. 순열, 조합에 대한 코딩 알고리즘 문제를 종종 볼 수 있는데, itertools만 알아놔도 아주 간단히 해결이 가능하다. 못 쓰게하면 어쩔 수 없지만.

Combinatoric iterators:

product(iterable, repeat=1)

Cartesian product, 곱집합을 iterable로 던져 준다. 곱집합의 개념을 처음 봐서 시작부터 난관이었다.

Roughly equivalent to nested for-loops in a generator expression.

>>> from itertools import product
>>> count = 0
>>> for i in product(['abc', 1, 2], repeat=2):
>>> ...    count+=1
>>> ...    print(i)
('abc', 'abc')
('abc', 1)
('abc', 2)
(1, 'abc')
(1, 1)
(1, 2)
(2, 'abc')
(2, 1)
(2, 2)
>>> print(count)
9   # 3 ** 2

>>> count = 0
>>> for i in product('abcd', [1, 2], repeat=3):
>>> ...    count+=1
>>> print(count)
512   # (4 * 2) ** 3

permutations(iterable, r=None)

해당 iterable에 대한 순열을 하나씩 던진다.

Return successive r length permutations of elements in the iterable.

>>> from itertools import permutations
>>> for i in permutations('abc', 2):
>>> ...    print(i)
('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')
>>> for i in permutations('abc', 3):
>>> ...    print(i)
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

combinations(iterable, r)

이것은 iterable의 조합 중 r 길이의 결과를 하나씩 던진다. permutations와 다르게 r 인자가 없으면 에러가 발생한다.

Return r length subsequences of elements from the input iterable.

>>> from itertools import combinations
>>> for i in combinations('abc', 1):
>>> ...    print(i)
('a',)
('b',)
('c',)
>>> for i in combinations('abc', 2):
>>> ...    print(i)
('a', 'b')
('a', 'c')
('b', 'c')
>>> for i in combinations('abc', 3):
>>> ...    print(i)
('a', 'b', 'c')

combinations_with_replacement(iterable, r)

중복이 가능한 순열 결과를 던진다.

Return r length subsequences of elements from the input iterable allowing individual elements to be repeated more than once.

>>> from itertools import combinations_with_replacement
>>> for i in combinations_with_replacement('abc', 2):
>>> ...    print(i)
('a', 'a')
('a', 'b')
('a', 'c')
('b', 'b')
('b', 'c')
('c', 'c')
>>> for i in combinations_with_replacement('abc', 3):
>>> ...    print(i)
('a', 'a', 'a')
('a', 'a', 'b')
('a', 'a', 'c')
('a', 'b', 'b')
('a', 'b', 'c')
('a', 'c', 'c')
('b', 'b', 'b')
('b', 'b', 'c')
('b', 'c', 'c')
('c', 'c', 'c')

References

Tags:

Updated:

Leave a comment