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

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

Все комбинации элементов списка, включая смену порядка

Синтаксис:

import itertools

itertools.permutations(iterable, r=None)

Параметры:

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

Описание:

Функция permutations() модуля itertools возвращает итератор с последовательными перестановками из элементов входной последовательности iterable. Каждая комбинация заключена в кортеж с длинной r элементов.

Если r не указано или None, тогда по умолчанию r равна длине iterable и генерируются все возможные перестановки полной длины.

Количество возвращенных сочетаний равно n! / (n-r)! если 0 <= r <= n или ноль если r > n.

Перестановки выводятся в лексикографическом порядке сортировки. Таким образом, если входная итерируемая последовательность отсортирована, то кортежи перестановок будут созданы в отсортированном порядке.

Элементы рассматриваются как уникальные в зависимости от их положения, а не от их значения. Поэтому, если входные элементы уникальны, повторных значений в каждой перестановке не будет.

Функция itertools.permutations() примерно эквивалентна следующему коду:

def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

Код функция itertools.permutations() также может быть выражен в виде подпоследовательности функция itertools.product(), отфильтрованной для исключения записей с повторяющимися элементами:

def permutations(iterable, r=None):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    for indices in product(range(n), repeat=r):
        if len(set(indices)) == r:
            yield tuple(pool[i] for i in indices)

Примеры использования:

>>> from itertools import permutations
>>> x = [1, 2, 3]
>>> list(permutations(x, 2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

>>> list(permutations(x))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]