簡體   English   中英

使用 Itertools 創建來自多個列表的元素組合列表

[英]Using Itertools to create a list of combination of elements from multiple lists

我有以下幾點:

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)

“梳子”會給我所有可能的 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)]

一旦發現它已經超過總和,該算法就會放棄分支。 如果無法達到總和,則存在更高級的算法,該算法也會放棄分支。

要生成所有此類結果的列表:

combs = [comb for comb in combs if sum(comb) ==1]

或者,如果您可以使用該數據的生成器:

combs = (comb for comb in combs if sum(comb) ==1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM