Как получить все комбинации из 2-х списков? - PullRequest
0 голосов
/ 10 июля 2020

Как сделать это в Python?

Вход:

num = [1, 2, 3]
alpha = ['a', 'b', 'c']

Выход:

[1, a] [1, a, b] [1, a, b, c] [1, b, c] [1, c]
[1, 2, a] [1, 2, a, b] ... [1, 2, c]
...
...
[3, a] [3, a, b] ... [3, c]

Ограничения:

The output expect all possible consecutive combinations
e.g. ['a'] ['a','b'] are desired while ['a','c'] is not.

Я пробовал вложить 4 цикла for / 4 цикла while. Распространена ли такая глубина петель?

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Далее используются только два вложенных цикла for

from itertools import product as prod

def consecutive_combos(a):
    " Generates consecutive ombinations of items in list "
    return [a[i:j] for i in range(len(a)) for j in range(i+1, len(a)+1)]

num = [1, 2, 3]
alpha = ['a', 'b', 'c']

# Generates product of sequences
result = [x + y for x, y in prod(consecutive_combos(num), consecutive_combos(alpha))]

print(result)

Выход

[[1, 'a'], [1, 'a', 'b'], [1, 'a', 'b', 'c'], [1, 'b'], [1, 'b', 'c'], [1, 'c'], [1, 2, 'a'], [1, 2, 'a', 'b'], [1, 2, 'a', 'b', 'c'], [1, 2, 'b'], [1, 2, 'b', 'c'], [1, 2, 'c'], [1, 2, 3, 'a'], [1, 2, 3, 'a', 'b'], [1, 2, 3, 'a', 'b', 'c'], [1, 2, 3, 'b'], [1, 2, 3, 'b', 'c'], [1, 2, 3, 'c'], [2, 'a'], [2, 'a', 'b'], [2, 'a', 'b', 'c'], [2, 'b'], [2, 'b', 'c'], [2, 'c'], [2, 3, 'a'], [2, 3, 'a', 'b'], [2, 3, 'a', 'b', 'c'], [2, 3, 'b'], [2, 3, 'b', 'c'], [2, 3, 'c'], [3, 'a'], [3, 'a', 'b'], [3, 'a', 'b', 'c'], [3, 'b'], [3, 'b', 'c'], [3, 'c']]
1 голос
/ 10 июля 2020

Вы можете использовать модуль itertools ans combinations

import itertools as it
l1 = []
# get all combinations of num
for i in range(1, len(num)+1):
    l1.extend([* it.combinations(num, i)])

# get all combinations of alpha
for j in range(1, len(alpha)+1):
    l2.extend([* it.combinations(alpha, j)])

# list comprehension to combine elements from the two lists
comb = [e1+e2 for e1 in l1 for e2 in l2]       

Делая это, вы получаете список кортежей.

Обновление:

По порядку чтобы учесть ограничение:

Ожидается, что на выходе все возможные последовательные комбинации

например, [a] [a, b] желательны, а [a, c] - нет.

num = [1, 2, 3]
alpha = ['a', 'b', 'c']
l1 = [num[i:j+1] for i in range(len(num)) for j in range(i, len(num))]
l2 = [alpha[i:j+1] for i in range(len(alpha)) for j in range(i, len(alpha))]

result = [e1+e2 for e1 in l1 for e2 in l2]
print(*result, sep="\n")
[1, 'a']
[1, 'a', 'b']
[1, 'a', 'b', 'c']
[1, 'b']
[1, 'b', 'c']
[1, 'c']
[1, 2, 'a']
[1, 2, 'a', 'b']
[1, 2, 'a', 'b', 'c']
[1, 2, 'b']
[1, 2, 'b', 'c']
[1, 2, 'c']
[1, 2, 3, 'a']
[1, 2, 3, 'a', 'b']
[1, 2, 3, 'a', 'b', 'c']
[1, 2, 3, 'b']
[1, 2, 3, 'b', 'c']
[1, 2, 3, 'c']
[2, 'a']
[2, 'a', 'b']
[2, 'a', 'b', 'c']
[2, 'b']
[2, 'b', 'c']
[2, 'c']
[2, 3, 'a']
[2, 3, 'a', 'b']
[2, 3, 'a', 'b', 'c']
[2, 3, 'b']
[2, 3, 'b', 'c']
[2, 3, 'c']
[3, 'a']
[3, 'a', 'b']
[3, 'a', 'b', 'c']
[3, 'b']
[3, 'b', 'c']
[3, 'c']
0 голосов
/ 10 июля 2020

надеюсь, это поможет

from itertools import combinations 
num = [1, 2, 3]
alpha = ["a", "b", "c"]
big_list=num+alpha
comb += list(combinations(big_list,2) )
comb += list(combinations(big_list,3) )
for i in list(comb): 
   print (i)

вывод:

(1, 2) (1, 3) (1, 'a') (1, 'b') ( 1, 'c') (2, 3) (2, 'a') (2, 'b') (2, 'c') (3, 'a') (3, 'b') (3, 'c') ('a', 'b') ('a', 'c') ('b', 'c') (1, 2, 3) (1, 2, 'а') (1, 2, 'б') (1, 2, 'c') (1, 3, 'а') (1, 3, 'б') (1, 3, ' c ') (1,' a ',' b ') (1,' a ',' c ') (1,' b ',' c ') (2, 3,' a ' ) (2, 3, 'b') (2, 3, 'c') (2, 'a', 'b') (2, 'a', 'c') (2, 'b ',' c ') (3,' a ',' b ') (3,' a ',' c ') (3,' b ',' c ') (' a ', 'b', 'c') [Завершено за 0,50 с]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...