2013-07-29 4 views
1

나는리스트로 주어진 n 차원 벡터와 모든 차원에 적용되는 오프셋의리스트를 결합하는 관용적 인 방법을 찾고있다. 즉 :두리스트의 값의 조합

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

원래부터 : 나는 다음과 같은 목록을 가져올

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

: 나는 다음과 같은 값과 오프셋이 주어

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]] 

성능을 여기에 문제가되지 않습니다 결과 목록의 순서도 중요하지 않습니다. 못생긴 중첩 루프없이 이것이 어떻게 생성 될 수 있는지에 대한 제안? itertools가 솔루션을위한 도구를 제공한다고 생각하지만, 아직 이해하지 못했습니다.

답변

6
from itertools import product  

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

하거나, 의견 제안 :

[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' 사례에 쉽게 확장되기 때문입니다. ->'제품에서의 y에 대한 map (sum, zip (v, y)) (o, repeat = len (v))]' –

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]] 
falsetru 및 Dobi 등
관련 문제