我有以下内容:
a = [i/100 for i in range(5,105,5)]
a.append(0)
b = [i/100 for i in range(5,105,5)]
b.append(0)
c = [i/100 for i in range(5,105,5)]
c.append(0)
d = [i/100 for i in range(5,105,5)]
d.append(0)
e = [i/100 for i in range(5,105,5)]
e.append(0)
combs = itertools.product(a,b,c,d,e)
'combs'会给我a,b,c,d和e的所有可能组合。但是,我想知道我是否可以将它们组合起来,以便它们加起来为1。
谢谢。
答案 0 :(得分:1)
据我所知,itertools中没有内置方法可以做到这一点。你可以明显地过滤结果,但这会相当效率低:只需要少量组合就可以加起来sum
。
鉴于所有馈送值均为正(零可接受)但是,您可以使用此惰性函数:
def product_sum(sum,*args):
return product_sum_intern(sum,0,0,[],*args)
def product_sum_intern(sum,cur_sum,idx,cur,*args):
if idx >= len(args):
if sum == cur_sum:
yield tuple(cur)
elif cur_sum <= sum:
for x in args[idx]:
cur.append(x)
for e in product_sum_intern(sum,cur_sum+x,idx+1,cur,*args):
yield e
cur.pop()
例如:
>>> list(product_sum(15,[1,12],[1,4,7],[0,3,6,7],[0,1]))
[(1, 7, 6, 1), (1, 7, 7, 0)]
一旦发现它已超过总和,该算法就会放弃分支。存在一种更高级的算法,如果无法达到总和,也会放弃分支。
答案 1 :(得分:0)
生成所有此类结果的列表:
combs = [comb for comb in combs if sum(comb) ==1]
或者,如果您可以使用该数据的生成器:
combs = (comb for comb in combs if sum(comb) ==1)