Вы ищете инструмент permutations_with_replacement
.
, который даст n ** r результатов , например, 3 ** 2 = 9 общих результатов.
В Python этот инструмент еще не реализован;причины неясны. Однако перестановок обычно можно реализовать с помощью декартового произведения .
Код
Модифицировано из документов:
def permutations_with_replacement(iter_, r=None):
"""Yield all or some permutations from a replenished pool; from docs."""
pool = tuple(iter_)
n = len(pool)
r = n if r is None else r
for indices in itertools.product(range(n), repeat=r):
#if len(set(indices)) == r:
#print(indices)
yield tuple(pool[i] for i in indices)
Демо
results = list(permutations_with_replacement([1, 2, 3], r=2))
len(results)
# 9
results
# [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
Эквивалентно уменьшено до:
list(itertools.product([1, 2, 3], repeat=2))
# [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
См. Также больше ответов на этот вопрос из предыдущего поста .