2012-04-18 43 views
-2

可能重複:
Finding all possible combinations of numbers to reach a given sum生成給定某個產品的列表的所有子集而不迭代整個powerset? (蟒蛇)

我不想因爲它輸出的順序,我不想要的東西用Itertools不能使用(我需要能夠評估組合發生器試圖輸出什麼,以決定是否要繼續沿着該分支行進)。

例如,假設我有一個列表[1,2,3,4,5],並且我想輸出具有完整產品< = 12的組合,而不會浪費迭代。如果我生成[1,2,3],這很好,因爲1 * 2 * 3 = 6。但是如果我嘗試[1,2,3,4],然後1 * 2 * 3 * 4 = 24,並且這大於12,所以我甚至不會打擾到[1,2,3,5]或[1,2,4,5]等等。

當前的嘗試:

from operator import mul 

mylist=[1,2,3,4,5] 
limit=12 

def productOK(mylist): #but this can be any conditional, theoretically 
    if reduce(mul, mylist) > limit: 
     return False 
    return True 


def generateValidSubsets(mylist): 
    for r in range(1,len(mylist)+1): 
     start=mylist[:r] 
     if productOK(start)==False: break 
     #not sure how to recombine in the right order otherwise 
     yield start 



for combo in generateValidSubsets(mylist): 
    print combo 

我要去哪裏錯了?

+0

所以......你是否試圖用循環來實際編碼? – Marcin 2012-04-18 13:57:49

+1

是的,但我不知道正確的方式遞歸地拆分列表,並以正確的順序看待事情 – AOAOne 2012-04-18 13:59:21

+0

@Marcin我試圖提前停止,如果它正在走下一條糟糕的道路,沒有跳過任何可能的好路徑。例如,在itertools中,如果我要提前打破循環,我可能會錯過其他長度有效的組合,只是因爲它們以較高的數字開頭 – AOAOne 2012-04-18 14:00:47

回答

0

我強烈建議您切換到遞歸實現。這將讓您更輕鬆地實施裁員:

def subs(target, universe, currentsubs, currentproduct, goodsubs): 
    first_from_universe_not_in_currentsubs = # an exercise for the reader 
    newsubs = [first_from_universe_not_in_currentsubs] + currentsubs 
    newproduct = currentproduct * first_from_universe_not_in_currentsubs 
    if newproduct == target: 
     return goodsubs + [newsubs] 
    elif newproduct > target: 
     return goodsubs 
    else: 
     return subs(target, universe, newsubs, newproduct, goodsubs) 

subs(12, [1,2,3,4,5], [], 0, []) 

即使你填空上面,它可能不是很正確,但它確實表明,你怎麼能實現晉級。

+0

我不認爲這是做我想做的事情(不能說出大多數這些變量的目的是什麼),我不認爲「首先從宇宙不在當前的潛艇」是特別有效的,如果它需要重新掃描整個列表。 – AOAOne 2012-04-18 14:35:24

+0

@AOAOne如果你不能理解代碼,那就暗示你正在尋找某人向你展示代碼。 – Marcin 2012-04-18 14:36:55

+0

我在說我不認爲這是在做我在問什麼。如果新產品等於目標,爲什麼它很重要?這與我的問題無關 - 我只關心它是否大於。但是,如果它大於,則返回「goodsubs」(我認爲這意味着「當前的良好解決方案」)。否則,我不確定哪些電流子以及爲什麼需要「首先來自宇宙不在當前的潛艇」,我認爲這又是一個漫長的過程。 – AOAOne 2012-04-18 14:39:48