Как вы возвращаете каждую возможную комбинацию из 2 списков в Python? - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу создать список всех возможных комбинаций между 2 списками элементов независимо от размера списка (они могут быть или не быть одинаковой длины).

Я просмотрел примеры itertools и искал stackoverflowно не нашел точного примера того, что я ищу.

ВХОД:

l1 = ['a', 'b', 'c']
l2 = [1, 2]

ВЫХОД:

['a1-b1-c1', 'a1-b1-c2', 'a1-b2-c1', 'a1-b2-c2', 'a2-b1-c1', 'a2-b1-c2', 'a2-b2-c1', 'a2-b2-c2']

но опять же, l1может быть любого размера и l2 может быть любого размера.Не заботьтесь о форматировании, просто хотите получить полный вывод.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Это решение создает шаблон из l1: например.'a{}-b{}-c{}'

from itertools import product
l1 = ['a', 'b', 'c']
l2 = [1, 2]
template = "{}-".join(l1) + "{}"
[template.format(*c) for c in product(l2, repeat=len(l1))]

['a1-b1-c1', 'a1-b1-c2', 'a1-b2-c1', 'a1-b2-c2', 'a2-b1-c1 ',' a2-b1-c2 ',' a2-b2-c1 ',' a2-b2-c2 ']

0 голосов
/ 15 февраля 2019

Вы можете использовать itertools.product и составить список, чтобы получить результат, который вам нужен:

from itertools import product
result = ["-".join(y+str(z) for y, z in zip(l1, x)) for x in product(*[l2] * 3)]

Я хотел бы отметить, что подход не дает никаких дополнительных промежуточных комбинаций.

Выход:

['a1-b1-c1', 'a1-b1-c2', 'a1-b2-c1', 'a1-b2-c2', 'a2-b1-c1', 'a2-b1-c2', 'a2-b2-c1', 'a2-b2-c2']
0 голосов
/ 15 февраля 2019

Вы можете использовать itertools.product:

from itertools import product
['-'.join(map(''.join, zip(l1, c))) for c in product(map(str, l2), repeat=len(l1))]

Возвращает:

['a1-b1-c1', 'a1-b1-c2', 'a1-b2-c1', 'a1-b2-c2', 'a2-b1-c1', 'a2-b1-c2', 'a2-b2-c1', 'a2-b2-c2']
0 голосов
/ 14 февраля 2019

Вы можете использовать itertools.product, чтобы сгенерировать все возможные 3-комбинации l2, а затем объединить каждую комбинацию с помощью l1.

from itertools import product

combs = product(map(str, l2), repeat=3)
['-'.join([x + y for x, y in zip(l1, c)]) for c in combs]
# ['a1-b1-c1', 'a1-b1-c2', 'a1-b2-c1', 'a1-b2-c2', 'a2-b1-c1', 'a2-b1-c2', 'a2-b2-c1', 'a2-b2-c2']
...