可能重複:
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
我要去哪裏錯了?
所以......你是否試圖用循環來實際編碼? – Marcin 2012-04-18 13:57:49
是的,但我不知道正確的方式遞歸地拆分列表,並以正確的順序看待事情 – AOAOne 2012-04-18 13:59:21
@Marcin我試圖提前停止,如果它正在走下一條糟糕的道路,沒有跳過任何可能的好路徑。例如,在itertools中,如果我要提前打破循環,我可能會錯過其他長度有效的組合,只是因爲它們以較高的數字開頭 – AOAOne 2012-04-18 14:00:47