2013-02-25 29 views
1

假設給出了一個長度爲4的矢量,其中最小值(0,0,0,0)和最大值(2,1,3,2) )。我想找到在此範圍內,加起來,說所有的整數向量,5Python:查找所有帶有約束元素的元組,並將它們合成一個常數

下面的代碼實現了:

maxvalues = (2,1,3,2) 
k = 5 
t = [] 
for x1 in range(maxvalues[0]+1): 
    for x2 in range(maxvalues[1]+1): 
     for x3 in range(maxvalues[2]+1): 
      for x4 in range(maxvalues[3]+1): 
        if x1+x2+x3+x4 is k: 
         t.append((x1,x2,x3,x4)) 

但是,此代碼不能一概而論很好地大載體和似乎有點低效。有沒有人有一個很好的方式來概括這個?

編輯:稍有不慎,忘了if語句

+0

你快到了。只要找到一種方法來使其成爲一個遞歸搜索,你將會推廣它! – Joe 2013-02-25 10:54:19

+2

作爲一個方面說明。不要在平等測試中使用'is'。數字沒有壞處。但如果你習慣了它,當你使用其他物體時,它可能會咬你。 – StoryTeller 2013-02-25 10:59:48

+0

更大的數字相同可能不完全相同。 – Fenikso 2013-02-25 11:24:38

回答

2

使用itertools.product

from itertools import product 

for x1, x2, x3, x4 in product(*(range(i+1) for i in maxvalues)): 
    t.append((x1, x2, x3, x4)) 

雖然更好(更普遍)將在product對象直接轉換成一個列表。

t = list(product(*(range(i+1) for i in maxvalues))) 

隨着if聲明包含,它會是這個樣子。

t = [i for i in product(*(range(i+1) for i in maxvalues)) if sum(i) == k] 
+0

+1。擊敗我納秒。儘管你可以從迭代構造列表。 – StoryTeller 2013-02-25 10:55:25

+0

這有幫助。但是,我仍然需要手動寫入n個變量。是否有可能迭代單個元組x? – Forzaa 2013-02-25 10:57:15

+0

@Forzaa我剛剛達到該部分 – Volatility 2013-02-25 10:57:55

相關問題