[英]Combine two list and output all possible combinations of list 1 given list 2
我在 python 中有兩個列表。
list1 = ['A', 'B']
list2 = [True, False]
list1 在現實世界中已被簡化,它將超過 2 個元素。 清單 2 只會是真或假。
我想生成以下 output,給定 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 做一些事情,但無法繞開它。 任何建議將不勝感激。
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)
OUTPUT:
[[['A', True], ['B', True]],
[['A', True], ['B', False]],
[['A', False], ['B', True]],
[['A', False], ['B', False]]]
OUTPUT 帶 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
您的列表理解力幾乎就在那里。 您只需要使用product
而不是permutations
,因為您想從list2
重復相同的值。 嘗試這個:
output = [list(zip(list1, x)) for x in itertools.product(list2, repeat=len(list1))]
這將創建一個 2 元組列表的列表。 如果您也需要最里面的元素是列表,則可以使用list(map(list, zip(...)))
。
我認為這會奏效
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 中的所有內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.