Получите комбинацию из 2-х списков - PullRequest
1 голос
/ 05 мая 2020

Я повторно отправляю этот вопрос, потому что в последнем посте мне сказали, что есть решение для этого.

У меня есть 2 списка:

list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]

Я хочу получить возможные комбинации из этих двух списков, означающие:

[["foo", "bar", "lorem"],
 ["foo", "bar", "loremX"],
 ["foo", "barX", "loremX"],
 ["fooX", "bar", "loremX"],
 ["fooX", "barX", "loremX"],
 ["foo", "barX", "lorem"],
 ["fooX", "barX", "lorem"],
 ["fooX", "bar", "lorem"],

 ["foo", "bar", "lorem"],
 ["foo", "bar", "loremY"],
 ["foo", "barY", "loremY"],
 ["fooY", "bar", "loremY"],
 ["fooY", "barY", "loremY"],
 ["foo", "barY", "lorem"],
 ["fooY", "barY", "lorem"],
 ["fooY", "bar", "lorem"]]

Надеюсь, я не пропустил ни одной комбинации.

Какая-то потеряно с этим.

Вероятно, это должно быть что-то с itertools.combinations_with_replacement

Спасибо.

EDIT

Прежде всего, спасибо @ titusarmah99 за отличный ответ. Мне удалось взять его второе и очень простое решение и сделать его общим c:

import itertools

list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]
list2new = [""] + list2
newList = [[list1[i]+list2new[j] for j in range(len(list2new))] for i in range(len(list1))]

for index in range(1, len(list2) + 1):
    for c in itertools.product([0,index],repeat=len(list1)):
        tmp = [newList[i][c[i]] for i in range(len(c))]
        print(tmp)

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Объедините каждую строку в list2 с пустой строкой, затем заархивируйте результат с помощью list1 и объедините строки.

from itertools import product

for item in list2:
    for suffixes in product(['', item], repeat=3):
        print([x + s for x, s in zip(list1, suffixes)])

Вывод:

['foo', 'bar', 'lorem']
['foo', 'bar', 'loremX']
['foo', 'barX', 'lorem']
['foo', 'barX', 'loremX']
['fooX', 'bar', 'lorem']
['fooX', 'bar', 'loremX']
['fooX', 'barX', 'lorem']
['fooX', 'barX', 'loremX']
['foo', 'bar', 'lorem']
['foo', 'bar', 'loremY']
['foo', 'barY', 'lorem']
['foo', 'barY', 'loremY']
['fooY', 'bar', 'lorem']
['fooY', 'bar', 'loremY']
['fooY', 'barY', 'lorem']
['fooY', 'barY', 'loremY']

Здесь я Я печатаю, чтобы показать списки по одной строке каждый, но вы можете легко изменить это, чтобы добавить их в другой список.

0 голосов
/ 05 мая 2020

Ключевым моментом здесь является использование вращения. Есть много способов повернуть массив , я буду использовать deque.

from collections import deque

list1 = ["foo", "bar", "lorem"]
list2 = ["X", "Y"]
list2new = [""] + list2
print(list2new) # ['', 'X', 'Y']

newList = [[list1[i]+list2new[j] for j in range(len(list2new))] for i in range(len(list1))]
print(newList)
# [['foo', 'fooX', 'fooY'], ['bar', 'barX', 'barY'], ['lorem', 'loremX', 'loremY']]

d = deque([0,0,0,1,1,1])
for it in range(2*len(list1)):
    tmp = [newList[i][d[i]] for i in range(len(list1))]
    print(tmp) #
    d.rotate(1)
# ['foo', 'bar', 'lorem']
# ['fooX', 'bar', 'lorem']
# ['fooX', 'barX', 'lorem']
# ['fooX', 'barX', 'loremX']
# ['foo', 'barX', 'loremX']
# ['foo', 'bar', 'loremX']

После этого мы можем повторить процесс для остальных значений в list2.

for x in range(1,len(list2new)):
    d = deque([0]*len(list1)+[x]*len(list1))
    d.rotate(1)
    for it in range(2*len(list1)-1): #
        tmp = [newList[i][d[i]] for i in range(len(list1))]
        print(tmp) #
        d.rotate(1)
# ['fooX', 'bar', 'lorem']
# ['fooX', 'barX', 'lorem']
# ['fooX', 'barX', 'loremX']
# ['foo', 'barX', 'loremX']
# ['foo', 'bar', 'loremX']
# ['fooY', 'bar', 'lorem']
# ['fooY', 'barY', 'lorem']
# ['fooY', 'barY', 'loremY']
# ['foo', 'barY', 'loremY']
# ['foo', 'bar', 'loremY']

Это не будет содержать ['foo', 'bar', 'lorem'], поэтому добавьте его вручную.

РЕДАКТИРОВАТЬ: Похоже, вы редактировали вопрос. Чтобы получить все возможные комбинации, просто введите newList и itertools.product

for c in itertools.product([0,1],repeat=3):
    tmp = [newList[i][c[i]] for i in range(len(c))]
    print(tmp) #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...