Как получить все возможные комбинации из списка в Python, допускающего повторение - PullRequest
0 голосов
/ 31 мая 2018

У меня есть список типа [1,2,3], и я хочу получить следующий результат:

1
1,1
1,1,1
1,2
1,2,1
1,2,2
1,2,3
1,2
1,3
1,3,3
2,1,2
2,2,1
3,1,1
etc

Я пытался использовать itertools, но я получаю только комбинации без повторений.

Кто-нибудь знает, как я могу получить список с желаемым результатом?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Быстрое решение вручную.Если вы заботитесь о производительности, вам, вероятно, стоит придерживаться itertools.

def all_combs(xs):
    res = []
    buf = [[]]
    lst = [[x] for x in xs]
    for _ in xs:
        buf = [r + l for r in buf for l in lst]
        res.extend(buf)

    return res
0 голосов
/ 31 мая 2018

Вам нужно itertools.combinations_with_replacement() и поменяйте r.это не в вашем заказе, так как неясно, является ли это требованием, например:

In []:
from itertools import combinations_with_replacement as cwr
nums = [1, 2, 3]
[x for n in range(1, len(nums)+1) for x in cwr(nums, r=n)]

Out[]:
[(1,), (2,), (3,), (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3), (1, 1, 1), (1, 1, 2), 
 (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3), (2, 2, 2), (2, 2, 3), (2, 3, 3), (3, 3, 3)]

In []:
from itertools import product
[x for n in range(1, len(nums)+1) for x in product(nums, repeat=n)]

Out[]:
[(1,), (2,), (3,), (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3), 
 (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), 
 (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), 
 (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), 
 (3, 3, 1), (3, 3, 2), (3, 3, 3)]
...