问题描述
我有一个整数列表,它们是随机排序的,并且可能重复:CREATE or REPLACE FUNCTION public.tf_test()
RETURNS trigger
NOT LEAKPROOF AS
$BODY$
DECLARE
targetid orderpayment.id%TYPE;
BEGIN
INSERT INTO
orderpayment(currencycode,tableorderid,payment,tip,paymentprocessor)
VALUES
(NEW.currency,NEW.orderid,NEW.amount,NEW.tip,1)
RETURNING id INTO targetid;
NEW.orderpayment = targetid;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
和某个值(例如:mylist = [5,4,2,5,6,7,3,8,3]
)
现在,我想从value=35
中获取一个整数列表,我们将其命名为mylist
,其中包括所有可能的数字选项,这些数字加起来为sumlist
。
这样我就可以这样做:
value
sum=0
for i in sumlist[0]:
sum+=i
将返回sum == value
。
解决方法
Itertools.combinations非常容易管理。当您为其提供列表和长度时,它将提供该长度的所有可能组合,并且与排列不同,它将删除重复项。为了确保尝试每个选项,必须尝试每个长度(从0到完整字符串),如下所示:
import itertools
def SumList(MyList,Value):
for Length in range(1,len(MyList)):
for ListOfVals in itertools.combinations(MyList,Length):
Total=0
for num in ListOfVals:
Total+=num
if Total==Value:
return(ListOfVals)
mylist=[5,4,2,5,6,7,3,8,3]
value=35
print(SumList(mylist,value))
>>[5,8]
作为一个简短的注解,它总是输出最短的组合,因为它会迭代从最短到最长的长度。