import itertools itertools.product(*iterables, repeat=1)
*iterables
- итерируемые последовательности,repeat=1
- int
, количество повторов.Функция product()
модуля itertools
возвращает декартово произведение входных итерируемых последовательностей *iterables
.
Функция itertools.product()
примерно эквивалентно вложенным циклам for .. in ..
в выражении генератора. Например выражение product(A, B)
возвращает то же, что и выражение-генератор ((x,y) for x in A for y in B)
.
Вложенные циклы цикличны, как одометр, с правым элементом, продвигающимся на каждой итерации. Этот шаблон создает лексикографическое упорядочение, так что если входные данные отсортированы, кортежи также выводятся в отсортированном порядке.
Чтобы вычислить декартово произведение последовательности с самим собой, укажите количество повторений в необязательном ключевом аргументе repeat
. Например выражение product(A, repeat=4)
означает то же самое, что и product(A, A, A, A)
.
Эта функция примерно эквивалентна следующему коду, за исключением того, что фактическая реализация не создает промежуточные результаты в памяти:
def product(*args, repeat=1): # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 pools = [tuple(pool) for pool in args] * repeat result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod)
>>> from itertools import product >>> x = ['a', 'b', 'c'] >>> y = ['1', '2'] >>> list(product(x, y)) # [('a', '1'), ('a', '2'), ('b', '1'), ('b', '2'), ('c', '1'), ('c', '2')] >>> list(product(y, repeat=3)) # [('1', '1', '1'), ('1', '1', '2'), ('1', '2', '1'), ('1', '2', '2'), # ('2', '1', '1'), ('2', '1', '2'), ('2', '2', '1'), ('2', '2', '2')] >>> list(product(x, y, repeat=2)) # [('a', '1', 'a', '1'), ('a', '1', 'a', '2'), ('a', '1', 'b', '1'), ('a', '1', 'b', '2'), # ('a', '1', 'c', '1'), ('a', '1', 'c', '2'), ('a', '2', 'a', '1'), ('a', '2', 'a', '2'), # ('a', '2', 'b', '1'), ('a', '2', 'b', '2'), ('a', '2', 'c', '1'), ('a', '2', 'c', '2'), # ('b', '1', 'a', '1'), ('b', '1', 'a', '2'), ('b', '1', 'b', '1'), ('b', '1', 'b', '2'), # ('b', '1', 'c', '1'), ('b', '1', 'c', '2'), ('b', '2', 'a', '1'), ('b', '2', 'a', '2'), # ('b', '2', 'b', '1'), ('b', '2', 'b', '2'), ('b', '2', 'c', '1'), ('b', '2', 'c', '2'), # ('c', '1', 'a', '1'), ('c', '1', 'a', '2'), ('c', '1', 'b', '1'), ('c', '1', 'b', '2'), # ('c', '1', 'c', '1'), ('c', '1', 'c', '2'), ('c', '2', 'a', '1'), ('c', '2', 'a', '2'), # ('c', '2', 'b', '1'), ('c', '2', 'b', '2'), ('c', '2', 'c', '1'), ('c', '2', 'c', '2')]