如何使用Python查找具有两种可能性之一的列表项的总和

如何使用Python查找具有两种可能性之一的列表项的总和,python,Python,例如,如果我有一个4.5的解决方案,并且有两个10个实数的列表,其中在每个位置(1st n、2nd n、3rd n…),每个条目只能使用两个列表中的一个条目,并且我需要找到遵循此规则的所有组合,这些组合将等于解决方案编号,如何实现 例如:溶液编号=4.5 第一个数字可以是0.75或0.1, 第二个数字可以是0.35或0.05, 第三个数字可以是 .... 第10个数字可以是0.05或0.03 如何找到每个位置包含一次的所有潜在组合,即每个位置的两个选项中的一个。如果元素数量相对较少,您可以使用i

例如,如果我有一个4.5的解决方案,并且有两个10个实数的列表,其中在每个位置(1st n、2nd n、3rd n…),每个条目只能使用两个列表中的一个条目,并且我需要找到遵循此规则的所有组合,这些组合将等于解决方案编号,如何实现

例如:溶液编号=4.5

第一个数字可以是0.75或0.1, 第二个数字可以是0.35或0.05, 第三个数字可以是 .... 第10个数字可以是0.05或0.03


如何找到每个位置包含一次的所有潜在组合,即每个位置的两个选项中的一个。

如果元素数量相对较少,您可以使用
itertools.product
生成每个可能的选择并查看总和。例如,如果我们从

lists = [[0.75, 0.35, 0.05], [0.1, 0.05, 0.03]]
target = 0.83
tol = 0.001
然后


这是因为
zip(*list)
为我们提供了元组,描述了我们只能做出的每个选择中的一个:

>>> list(zip(*lists))
[(0.75, 0.1), (0.35, 0.05), (0.05, 0.03)]
然后,
产品
为我们提供了每一组可能的选择:

>>> list(product(*zip(*lists)))
[(0.75, 0.35, 0.05), (0.75, 0.35, 0.03), (0.75, 0.05, 0.05), (0.75, 0.05, 0.03), (0.1, 0.35, 0.05), (0.1, 0.35, 0.03),]
请注意,随着列表大小的增加,这种暴力搜索将很快变得不可行,但如果列表很短,也不算太糟糕。如果你只关心找到任何解决方案,你可以这样做

>>> next(p for p in product(*choices) if abs(sum(p)-target) < tol)
(0.75, 0.05, 0.03)
>>下一步(产品(*选项)中的p表示p,如果abs(总和(p)-目标)

如果元素数量相对较低,则可以使用
itertools.product
生成所有可能的选择并查看总和。例如,如果我们从

lists = [[0.75, 0.35, 0.05], [0.1, 0.05, 0.03]]
target = 0.83
tol = 0.001
然后


这是因为
zip(*list)
为我们提供了元组,描述了我们只能做出的每个选择中的一个:

>>> list(zip(*lists))
[(0.75, 0.1), (0.35, 0.05), (0.05, 0.03)]
然后,
产品
为我们提供了每一组可能的选择:

>>> list(product(*zip(*lists)))
[(0.75, 0.35, 0.05), (0.75, 0.35, 0.03), (0.75, 0.05, 0.05), (0.75, 0.05, 0.03), (0.1, 0.35, 0.05), (0.1, 0.35, 0.03),]
请注意,随着列表大小的增加,这种暴力搜索将很快变得不可行,但如果列表很短,也不算太糟糕。如果你只关心找到任何解决方案,你可以这样做

>>> next(p for p in product(*choices) if abs(sum(p)-target) < tol)
(0.75, 0.05, 0.03)
>>下一步(产品(*选项)中的p表示p,如果abs(总和(p)-目标)
一旦找到一个就会停止