2015-06-30 45 views
1

我試圖爲任意數量的相同對象生成所有可能的1維位置的列表。我想要它的格式,所以每個座標是距前一個對象的距離,因此對於3個對象(0,5,2)將表示一個對象位於位置0,另一個位於位置5,另一個位於位置7.位置組合的Python列表

所以主要的限制是座標的總和是< = D。嵌套for循環適用於此。例如,對於具有最大座標D的3個對象:

def positions(D): 
    output=[] 
    for i in range(D+1): 
     for j in range(D+1-i): 
      for k in range(D+1-i-j): 
       output.append((i,j,k)) 
    return(output) 

將此擴展到任意數量的對象的最佳方法是什麼?如果沒有明確編寫特定數量的for循環,我找不到一個好方法。

+0

使用'itertools.combinations'? – raser

回答

3

我認爲你可以結合itertools.combinations,這將給你的位置,採取不同的,這應該給你你「與前一個對象的距離」的行爲。例如,使用

def diff(loc): 
    return [y-x for x,y in zip((0,) + loc, loc)] 

我們

In [114]: list(itertools.combinations(range(4), 3)) 
Out[114]: [(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)] 

的可能位置,然後

In [115]: [diff(x) for x in itertools.combinations(range(4), 3)] 
Out[115]: [[0, 1, 1], [0, 1, 2], [0, 2, 1], [1, 1, 1]] 

您的相對距離的版本。

+0

完美,謝謝! – user2297541