python - 使用 Itertools 从多个列表中创建元素组合列表

标签 python list combinations python-itertools

我有以下内容:

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。

谢谢。

最佳答案

据我所知, 中没有内置方法去做这个。您显然可以过滤结果,但这会效率低下:人们希望只有少量组合加起来达到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)]

这个算法一旦发现它已经超出和,就会放弃分支。存在一种更高级的算法,如果无法达到总和,它也会放弃分支。

关于python - 使用 Itertools 从多个列表中创建元素组合列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704432/

相关文章:

python - 如何使用python获得具有所需精度的 float

python-3.x - 类型错误 : must be real number, 未列出

python - 创建相应的字母数字元素列表

machine-learning - 如何在不使用计算器或代码的情况下手动计算(200)C(100)和这么大的数字的组合?

r - 如何查找列中的所有组合并计算数据中的出现次数

python - 用 Python 解决难题

python - Pandas Dataframe 按行数创建任意 Bins

Python-socket.error : Cannot assign requested address

python - 使用 Python 的 P2P 应用程序

Python - 从字典列表中提取值(由 SQL 命令生成)