Найти все возможные комбинации разных списков с различной длиной выходных списков в Python (НЕ Дубликат) - PullRequest
0 голосов
/ 02 ноября 2018

Я пытался найти все комбинации элементов в разных списках.

Я пытался с помощью itertools.product (), но я получаю выходные списки фиксированной длины

 import itertools
 a=[2,4,6,8,10]
 b=[3,6,9]
 c=[5,10]
 d=[10]
 l=list(itertools.product(a,b,c,d))
 print(l)
 [(2, 3, 5, 10), (2, 3, 10, 10), (2, 6, 5, 10), (2, 6, 10, 10), (2, 9, 5, 10), (2, 9, 10, 10), (4, 3, 5, 10), (4, 3, 10, 10), (4, 6, 5, 10), (4, 6, 10, 10), (4, 9, 5, 10), (4, 9, 10, 10), (6, 3, 5, 10), (6, 3, 10, 10), (6, 6, 5, 10), (6, 6, 10, 10), (6, 9, 5, 10), (6, 9, 10, 10), (8, 3, 5, 10), (8, 3, 10, 10), (8, 6, 5, 10), (8, 6, 10, 10), (8, 9, 5, 10), (8, 9, 10, 10), (10, 3, 5, 10), (10, 3, 10, 10), (10, 6, 5, 10), (10, 6, 10, 10), (10, 9, 5, 10), (10, 9, 10, 10)]

Но мне нужен вывод списков различной длины и комбинаций, таких как

      Expected output : [2,3,5,10],
                        [2,3,5],
                        [2,3,10],
                        [2,3,10,10], 
                        [2,3],
                        [2,6,5,10],
                        [2,6,10,10],
                        [2,6,5],
                        [2,6],
                        [2,9,5,10],
                        [2,9,5],
                        [2,9],
                        [2,9,10,10],
                        [4,3,5,10],
                        [4,3,5],
                        [4,3,10,10],
                        .
                        .     
                        [10,9,10,10]
                        ...so on 

Я пытался использовать комбинации, комбинируя все списки, но это не дало требуемого вывода

a=[2,4,6,8,10,3,6,9,5,10]
import itertools
for i in range(1,4):
     b=list(itertools.combinations(a,i))
     print(b)

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

1 Ответ

0 голосов
/ 02 ноября 2018

Ваша цель - выбрать один элемент или ни одного из каждого списка, верно? Поэтому добавьте None (или любое другое не встречающееся значение) в каждый список, запустите itertools.product() и уберите None из каждого из результатов. Готово.

>>> raw = itertools.product(a+[None], b+[None], c+[None])
>>> clean = [ [ e for e in result if e is not None ] for result in raw ]
>>> clean[:10]
[[2, 3, 10], [2, 3], [2, 6, 5], [2, 6, 10], [2, 6], [2, 9, 5], [2, 9, 10], [2, 9], 
[2, 5], [2, 10]]
...