我有如下代码片段:
import itertools
numbers = [352.07, 15.20, 15.22, 2505.71, 2050.86,
337.86, 833.90, 314.83]
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == 2842.77]
print(result)
从本质上讲,它使用itertool库获取数字列表,并尝试查找将哪些数字加起来求和(在本示例中为2842.77)。但是,在这种情况下,列表中的所有数字都不会实际加到目标数字上。
是否可以添加任何代码,以便在不存在完全匹配的情况下将CLOSEST编号设为目标编号?在此示例中,我正在寻找要吐出的控制台:
(2505.71,337.86),最接近的数字:2843.57
谢谢!
您可以使用min()
来获得总和与目标之间的绝对差最小的序列,例如,使用key
参数to min()
:
import itertools as it
# From itertools recipes
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return it.chain.from_iterable(it.combinations(s, r) for r in range(len(s)+1))
In []:
target = 2842.77
result = min(powerset(numbers), key=lambda seq: abs(sum(seq)-target))
result
Out[]:
(2505.71, 337.86)
In []:
sum(result)
Out[]:
2843.57
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句