首页 > 解决方案 > 组合两个列表并在给定列表 2 的情况下输出列表 1 的所有可能组合

问题描述

我在 python 中有两个列表。

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

list1 在现实世界中已被简化,它将超过 2 个元素。清单 2 只会是真或假。

我想生成以下输出,给定 list1 中的 2 个元素:

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

我希望算法能够支持 list1 中包含 2 个以上元素的场景。

以下是 list1 中包含 3 个元素的示例:

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 做一些事情,但无法绕开它。任何建议将不胜感激。

标签: pythonitertools

解决方案


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 或 C)分隔到自己的列表中。这会产生:

[[['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

推荐阅读