簡體   English   中英

Python:找到list中元素的所有組合達到某個值

[英]Python: find all combinations of elements in list to reach a certain value

我得到了一個列表,例如: [2,5,8]和一個值c ,例如 33。因此,因為列表的長度是3 ,我必須返回一個元組列表(i,j,k)其中i*w[0] + j*w[1] + k*w[2] == c (33)

當然,這很容易用3個for循環解決,如圖:

res = []
for i in range(c+1):
   for j in range(c+1):
       for g in range(c+1):
           if i*self.w[0] + j*self.w[1] + g*self.w[2] == c:
              res.append((i,j,g))
return sorted(res)

output 將是:

[(0, 5, 1), (1, 3, 2), (2, 1, 3), (4, 5, 0), (5, 3, 1), (6, 1, 2), (9, 3, 0), (10, 1, 1), (14, 1, 0)]

問題是我也必須對其他長度的列表執行此操作。 所以我的問題是; 對於長度為x (不太大)和給定值c的列表,有誰知道通常如何做到這一點?

使用itertools.productoperator.mul

>>> [k for k in product(range(c+1), repeat=len(w)) if sum(map(mul, w, k)) == c]
[(0, 5, 1), (1, 3, 2), (2, 1, 3), (4, 5, 0), (5, 3, 1), (6, 1, 2), (9, 3, 0), (10, 1, 1), (14, 1, 0)]

您可以使用itertools.productzip在此處進行歸納:

import itertools
w = [3,1,2,5]
c = 33
l = [range(c + 1)] * len(w)
res = []
for values in itertools.product(*l):
    if sum(a * b for a, b in zip(w, values)) == c:
        res.append(values)
print(sorted(res))

如果需要,構建res的循環可以替換為列表理解。 也就是說:

res = [values for values in itertools.product(*l)
           if sum(a * b for a, b in zip(w, values)) == c]

暫無
暫無

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

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