Encuentra valores en la lista que sumn a un valor dado

Estoy tratando de codificar algo simple y pythonic para identificar combinaciones de valores de una lista que sumen un valor definido, dentro de cierta tolerancia.

Por ejemplo:

si A=[0.4,2,3,1.4,2.6,6.3] y el valor objective es 5 +/- 0.5 , entonces la salida que deseo es (2,3), (1.4,2.6), (2,2.6), (0.4,2,3), (0.4,3,1.4) etc. si no se encuentran combinaciones, la función debe devolver 0 o ninguno o algo similar.

Cualquier ayuda sería muy apreciada.

Aquí hay un enfoque recursivo:

 # V is the target value, t is the tolerance # A is the list of values # B is the subset of A that is still below Vt def combination_in_range(V, t, A, B=[]): for i,a in enumerate(A): if a > V+t: # B+[a] is too large continue # B+[a] can still be a possible list B.append(a) if a >= Vt: # Found a set that works print B # recursively try with a reduced V # and a shortened list A combination_in_range(Va, t, A[i+1:], B) B.pop() # drop [a] from possible list A=[0.4, 2, 3, 1.4, 2.6, 6.3] combination_in_range(5, 0.5, A) 

Echa un vistazo a itertools.combinations

 def first_attempt(A=A): for i in xrange(1,len(A)+1): print [comb for comb in list(itertools.combinations(A,i)) if 4.5 < sum(map(float, comb)) < 5.5 ] ## -- End pasted text -- In [1861]: %timeit first_attempt 10000000 loops, best of 3: 29.4 ns per loop 

Salida -

 In [1890]: first_attempt(A=A) [] [(2, 3), (2, 2.6)] [(0.4, 2, 3), (0.4, 2, 2.6), (0.4, 3, 1.4)] [] [] []