2017-01-18 1 views
0

Если у меня есть решение, которое составляет, например, 4,5, и у каждого из них есть два списка из 10 действительных чисел, где в каждой позиции (1-е n, 2-е n , 3rd n ..) только одна запись из обоих списков может использоваться для каждой записи, и мне нужно найти все комбинации, следующие за этим правилом, которые будут равны номеру решения, как это можно сделать?Как найти сумму элементов списка с одной из двух возможностей с использованием Python

например: количество раствора = 4,5

первое число может быть либо 0,75 или 0,1, вторая цифра может быть либо 0,35 или 0,05, третьего число может быть либо .... 10-е число может быть либо 0,05 или 0,03.

Как найти все потенциальные комбинации, где каждая позиция включена один раз, являясь одним из двух вариантов для каждой позиции.

ответ

2

Если количество элементов относительно невелико, вы можете использовать itertools.product для генерации каждого возможного выбора и просмотра сумм. Например, если мы начнем с

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

затем

from itertools import product 
choices = zip(*lists) 
solutions = [p for p in product(*choices) if abs(sum(p)-target) < tol] 

дает

>>> solutions 
[(0.75, 0.05, 0.03)] 

Это работает, потому что zip(*lists) дает нам кортежи описания каждого выбора, мы можем только сделать одно из следующего:

>>> list(zip(*lists)) 
[(0.75, 0.1), (0.35, 0.05), (0.05, 0.03)] 

, а затем product дает нам все возможные группы выбора:

>>> 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) 

, который будет остановить, как только один найдено.

+0

Спасибо! Perfecto – McLeodx

Смежные вопросы