Объедините два списка и выведите все возможные комбинации из списка 1 из данного списка 2 - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть два списка в Python.

list1 = ['A', 'B']
list2 = [True, False]

list1 был упрощен в реальном мире, это будет больше, чем 2 элемента. список 2 будет только истинным или ложным.

Я хотел бы сгенерировать следующий вывод, учитывая 2 элемента в списке 1:

output=[
    [['A', True], ['B', True]],
    [['A', False], ['B', True]],
    [['A', True], ['B', False]],
    [['A', False], ['B', False]]]

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

Вот пример с 3 элементами в списке 1.

list1 = ['A', 'B', 'C']
list2 = [True, False]

output=[
    [['A', True], ['B', True], ['C', True]],
    [['A', True], ['B', True], ['C', False]],
    [['A', True], ['B', False], ['C', True]],
    [['A', False], ['B', True], ['C', True]],
    [['A', False, ['B', False], ['C', True]],
    [['A', True], ['B', False, ['C', False]],
    [['A', False], ['B', True], ['C', False]],
    [['A', False], ['B', False], ['C', False]]
    ]

Следующее приближает меня, но не совсем.

[zip(x, list2) for x in it.permutations(list1, len(list2))]

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

Ответы [ 3 ]

1 голос
/ 01 ноября 2019
from pprint import pprint
import itertools

list1 = ['A', 'B']
list2 = [True, False]

newdict = {}
final_list = []
for element in itertools.product(list1,list2):
    if element[0] not in newdict.keys():
        newdict[element[0]] = []
    newdict[element[0]].append(list(element))
values =  (list(newdict.values()))


for x in itertools.product('01', repeat=len(values)):
    tmp_list = []
    for i,index in enumerate(list(x)):
        tmp_list.append(values[int(i)][int(index)])
    final_list.append(tmp_list)

pprint (final_list)

ВЫХОД:

[[['A', True], ['B', True]],
 [['A', True], ['B', False]],
 [['A', False], ['B', True]],
 [['A', False], ['B', False]]]

ВЫХОД С A, B, C:

[[['A', True], ['B', True], ['C', True]],
 [['A', True], ['B', True], ['C', False]],
 [['A', True], ['B', False], ['C', True]],
 [['A', True], ['B', False], ['C', False]],
 [['A', False], ['B', True], ['C', True]],
 [['A', False], ['B', True], ['C', False]],
 [['A', False], ['B', False], ['C', True]],
 [['A', False], ['B', False], ['C', False]]]

Сначала я беру декартово произведение, но отделяю каждый ключ (A, Bили в) в свой список. Это дает:

[[['A', True], ['A', False]],
 [['B', True], ['B', False]],
 [['C', True], ['C', False]]]

Оттуда мы просто считаем в двоичном виде для индексации в этом списке. например,

000 = A,True B,True C,True
001 = A,True B,True C,False
...
111 = A,False B,False C,False
1 голос
/ 01 ноября 2019

Вы почти там со своим пониманием списка. Вам просто нужно использовать product вместо permutations, так как вы хотите повторить те же значения из list2. Попробуйте это:

output = [list(zip(list1, x)) for x in itertools.product(list2, repeat=len(list1))]

Это создает список списков из двух кортежей. Если вам нужно, чтобы самые внутренние элементы тоже были списками, вы можете использовать list(map(list, zip(...))).

0 голосов
/ 01 ноября 2019

Я думаю, что это будет работать

import itertools
list1=['A','B']
list2 = [True, False]

output=[]
for a,b in itertools.product(list1,list2):
    temp=[]
    temp.append(a)
    temp.append(b)
    output.append(temp)

print(output)

Это в основном перестановка всего в list1 с list2

...