Сообщить об ошибке.

Функция product() модуля itertools в Python

Декартово произведение входных последовательностей

Синтаксис:

import itertools

itertools.product(*iterables, repeat=1)

Параметры:

Возвращаемое значение:

Описание:

Функция 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')]