Перестановки с повторениями? - PullRequest
1 голос
/ 03 октября 2019

Я могу сделать это с помощью itertools:

list(permutations([1,2,3],2))
: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

, но как мне также сгенерировать:

 (1,1),(2,2),(3,3)

, конечно, без этого отдельно: [(i, i)для меня в диапазоне (4)]

Ответы [ 3 ]

3 голосов
/ 03 октября 2019

Добавляя к комментарию Накора, похоже, что вы хотите получить декартово произведение . Вы можете получить это с list(itertools.product([1,2,3],repeat=2)).

Перестановки с другой стороны, согласно документации

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

, так что, похоже, нет способа использовать list(itertools.permutations([1,2,3],2)) и получить желаемый результат без использования дополнительной логики.

1 голос
/ 05 октября 2019

Вы ищете инструмент 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)]

См. Также больше ответов на этот вопрос из предыдущего поста .

0 голосов
/ 03 октября 2019

Накор получил правильный ответ:

  product([1,2,3], repeat=2)

Я сделал ошибку, чтобы попытаться:

 list(product([1,2,3],2))

, какие ошибки:

  TypeError: 'int' object is not iterable
...