合并两个列表,并在给定列表2的情况下输出列表1的所有可能组合[重复]

问题描述 投票:-3回答:3

此问题已经在这里有了答案:

我在python中有两个列表。

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

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

我想生成以下输出,给定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做一些事情,但不能将我的头缠在它上面。任何建议将不胜感激。

python itertools
3个回答
0
投票

我认为这会起作用

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)

基本上是用list2置换list1中的所有内容


0
投票
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

0
投票

您的列表理解力几乎在那里。您只需要使用product而不是permutations,因为您要从list2重复相同的值。试试这个:

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

这将创建一个包含2个元组的列表。如果您也需要将最里面的元素作为列表,则可以使用list(map(list, zip(...)))

© www.soinside.com 2019 - 2024. All rights reserved.