如何找到从第一个列表中选择一个项目和从第二个列表中选择最多 n 个项目的所有组合
How to find all combinations of picking one item from the first list and at most n items from the second list
我有两个列表,我想 return 一个新的列表列表,其中每个列表都是从第一个列表中恰好选择一个项目并且最多 2第二个列表中的项目:
来自实例:
vaccinate_list: [('vaccinate', (2, 3)), ('vaccinate', (8, 1))]
quarantine_list: [('quarantine', (6, 3)), ('quarantine', (3, 4)), ('quarantine', (0, 1))]
将return(没有新行):
allCombinations = [
[('vaccinate', (2, 3))],
[('vaccinate', (8, 1))],
[('vaccinate', (2, 3)), ('quarantine', (6, 3))],
[('vaccinate', (2, 3)), ('quarantine', (3, 4))],
[('vaccinate', (2, 3)), ('quarantine', (0, 1))],
[('vaccinate', (8, 1)), ('quarantine', (6, 3))],
[('vaccinate', (8, 1)), ('quarantine', (3, 4))],
[('vaccinate', (8, 1)), ('quarantine', (0, 1))],
[('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (3, 4))],
[('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (0, 1))],
[('vaccinate', (2, 3)), ('quarantine', (3, 4)), ('quarantine', (0, 1))],
[('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (3, 4))],
[('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (0, 1))],
[('vaccinate', (8, 1)), ('quarantine', (3, 4)), ('quarantine', (0, 1))]
]
我尝试使用 intertools 组合并挣扎,
请帮忙
最好的方法是使用 itertools.product。见下文(评论中的解释):
allCombinations=[]
allCombinations.extend(vaccinate_list) #add items of vaccinate_list only
list_one=[i for i in itertools.product(vaccinate_list, quarantine_list)] #get all combinations with one item from each list
allCombinations.extend(list_one) #add them to allcombinations
list_two_temp=[i for i in itertools.combinations(quarantine_list, 2)] #get combinations of 2, in quarantine_list
list_two=[i for i in itertools.product(vaccinate_list, list_two_temp)] #get combinations with 1 item from vaccinate_list and 2 from quarantine_list
list_two=[(i[0],i[1][0], i[1][1]) for i in list_two] #flatten the items from previous list
allCombinations.extend(list_two) #add them to allcombinations
allCombinations=[list(i) for i in allCombinations] #change all items to list
print(allCombinations)
输出:
[['vaccinate', (2, 3)], ['vaccinate', (8, 1)], [('vaccinate', (2, 3)), ('quarantine', (6, 3))], [('vaccinate', (2, 3)), ('quarantine', (3, 4))], [('vaccinate', (2, 3)), ('quarantine', (0, 1))], [('vaccinate', (8, 1)), ('quarantine', (6, 3))], [('vaccinate', (8, 1)), ('quarantine', (3, 4))], [('vaccinate', (8, 1)), ('quarantine', (0, 1))], [('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (3, 4))], [('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (0, 1))], [('vaccinate', (2, 3)), ('quarantine', (3, 4)), ('quarantine', (0, 1))], [('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (3, 4))], [('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (0, 1))], [('vaccinate', (8, 1)), ('quarantine', (3, 4)), ('quarantine', (0, 1))]]
for i in vaccinate_list:
all_combinations.append(i)
for i in vaccinate_list:
for j in quarantine_list:
all_combinations.append((i,j))
for i in vaccinate_list:
for j in quarantine_list:
for k in quarantine_list:
all_combinations.append((i, j, k))
可能会很复杂,而且可能是一种愚蠢的方法,但它确实有效
我有两个列表,我想 return 一个新的列表列表,其中每个列表都是从第一个列表中恰好选择一个项目并且最多 2第二个列表中的项目: 来自实例:
vaccinate_list: [('vaccinate', (2, 3)), ('vaccinate', (8, 1))]
quarantine_list: [('quarantine', (6, 3)), ('quarantine', (3, 4)), ('quarantine', (0, 1))]
将return(没有新行):
allCombinations = [
[('vaccinate', (2, 3))],
[('vaccinate', (8, 1))],
[('vaccinate', (2, 3)), ('quarantine', (6, 3))],
[('vaccinate', (2, 3)), ('quarantine', (3, 4))],
[('vaccinate', (2, 3)), ('quarantine', (0, 1))],
[('vaccinate', (8, 1)), ('quarantine', (6, 3))],
[('vaccinate', (8, 1)), ('quarantine', (3, 4))],
[('vaccinate', (8, 1)), ('quarantine', (0, 1))],
[('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (3, 4))],
[('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (0, 1))],
[('vaccinate', (2, 3)), ('quarantine', (3, 4)), ('quarantine', (0, 1))],
[('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (3, 4))],
[('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (0, 1))],
[('vaccinate', (8, 1)), ('quarantine', (3, 4)), ('quarantine', (0, 1))]
]
我尝试使用 intertools 组合并挣扎, 请帮忙
最好的方法是使用 itertools.product。见下文(评论中的解释):
allCombinations=[]
allCombinations.extend(vaccinate_list) #add items of vaccinate_list only
list_one=[i for i in itertools.product(vaccinate_list, quarantine_list)] #get all combinations with one item from each list
allCombinations.extend(list_one) #add them to allcombinations
list_two_temp=[i for i in itertools.combinations(quarantine_list, 2)] #get combinations of 2, in quarantine_list
list_two=[i for i in itertools.product(vaccinate_list, list_two_temp)] #get combinations with 1 item from vaccinate_list and 2 from quarantine_list
list_two=[(i[0],i[1][0], i[1][1]) for i in list_two] #flatten the items from previous list
allCombinations.extend(list_two) #add them to allcombinations
allCombinations=[list(i) for i in allCombinations] #change all items to list
print(allCombinations)
输出:
[['vaccinate', (2, 3)], ['vaccinate', (8, 1)], [('vaccinate', (2, 3)), ('quarantine', (6, 3))], [('vaccinate', (2, 3)), ('quarantine', (3, 4))], [('vaccinate', (2, 3)), ('quarantine', (0, 1))], [('vaccinate', (8, 1)), ('quarantine', (6, 3))], [('vaccinate', (8, 1)), ('quarantine', (3, 4))], [('vaccinate', (8, 1)), ('quarantine', (0, 1))], [('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (3, 4))], [('vaccinate', (2, 3)), ('quarantine', (6, 3)), ('quarantine', (0, 1))], [('vaccinate', (2, 3)), ('quarantine', (3, 4)), ('quarantine', (0, 1))], [('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (3, 4))], [('vaccinate', (8, 1)), ('quarantine', (6, 3)), ('quarantine', (0, 1))], [('vaccinate', (8, 1)), ('quarantine', (3, 4)), ('quarantine', (0, 1))]]
for i in vaccinate_list:
all_combinations.append(i)
for i in vaccinate_list:
for j in quarantine_list:
all_combinations.append((i,j))
for i in vaccinate_list:
for j in quarantine_list:
for k in quarantine_list:
all_combinations.append((i, j, k))
可能会很复杂,而且可能是一种愚蠢的方法,但它确实有效