我在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做一些事情,但无法将我的头缠住它。任何建议将不胜感激。
答案 0 :(得分:1)
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
答案 1 :(得分:1)
您的列表理解力就差不多到了。您只需要使用product
而不是permutations
,因为您想从list2
重复相同的值。试试这个:
output = [list(zip(list1, x)) for x in itertools.product(list2, repeat=len(list1))]
这将创建2元组列表的列表。如果您也需要将最里面的元素作为列表,则可以使用list(map(list, zip(...)))
。
答案 2 :(得分: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中的所有内容