2013-07-29 57 views
1

我正在尋找一種將n維矢量(以列表形式給出)與偏移量列表相結合的慣用方式,它應應用於每個維度。 即:假設我有以下值和偏移:兩個列表的值的組合

v = [5, 6] 
o = [-1, 2, 3] 

我希望獲得下面的列表:

n = [[4, 5], [7, 5], [8, 5], [4, 8], [7, 8], [8, 8], [4, 9], [7, 9], [8, 9]] 

源自:

n = [[5-1, 6-1], [5+2, 6-1], [5+3, 6-1], [5-1, 6+2], [5+2, 6+2], [5+3, 6+2], [5-1, 6+3], [5+2, 6+3], [5+3, 6+3]] 

性能不是這裏的問題結果列表的順序也無關緊要。任何關於如何在沒有醜陋嵌套for循環的情況下生成這些建議?我想itertools提供瞭解決方案的工具,但我還沒有弄明白。

回答

6
from itertools import product  

[map(sum, zip(*[v, y])) for y in product(o, repeat=2)] 

,或者作爲falsetru和DOBI建議在註釋:

[map(sum, zip(v, y)) for y in product(o, repeat=len(v))] 
+2

你可以用'拉鍊(V,Y)的''而不是拉鍊(* [V,Y])'。 – falsetru

+0

@falsetru謝謝,真 –

+1

謝謝。我最喜歡這個答案,因爲它很容易擴展到'len(v)!= 2'的地方。 (o,repeat = len(v))]的'[map(sum,zip(v,y))' –

1

您可以使用itertools模塊獲取所有排列。

2

itertools.product()爲您提供了所需的o組合。使用與列表理解創建n

from itertools import product 

n = [[v[0] + x, v[1] + y] for x, y in product(o, repeat=2)] 

演示:

>>> [[v[0] + x, v[1] + y] for x, y in product(o, repeat=2)] 
[[4, 5], [4, 8], [4, 9], [7, 5], [7, 8], [7, 9], [8, 5], [8, 8], [8, 9]] 
2

使用itertools.product:

>>> import itertools 
>>> 
>>> v = [5, 6] 
>>> o = [-1, 2, 3] 
>>> 
>>> x, y = v 
>>> [[x+dx, y+dy] for dx, dy in itertools.product(o, repeat=2)] 
[[4, 5], [4, 8], [4, 9], [7, 5], [7, 8], [7, 9], [8, 5], [8, 8], [8, 9]] 

源自:

[[5-1, 6-1], [5-1, 6+2], [5-1, 6+3], [5+2, 6-1], [5+2, 6+2], [5+2, 6+3], [5+3, 6-1], [5+3, 6+2], [5+3, 6+3]]