2009-12-10 4 views
16

저는 파이썬을 처음 접했고 가장 좋은 방법을 모릅니다.파이썬의 튜플 목록에 튜플을 추가하십시오.

포인트를 나타내는 튜플 목록과 오프셋을 나타내는 다른 목록이 있습니다. 이 모든 형태의 조합이 필요합니다. 여기에 일부 코드입니다 :

offsets = [(0, 0),(0,-1),(0, 1),(1, 0),(-1, 0)] 
points = [(1, 5),(3, 3),(8, 7)] 

그래서 결합 된 점 내 세트는 내가 NumPy와 또는 다른 라이브러리를 사용할 수 아니에요

[(1, 5),(1, 4),(1, 6),(2, 5),(0, 5), 
(3, 3),(3, 2),(3, 4),(4, 3),(2, 3), 
(8, 7),(8, 6),(8, 8),(9, 7),(7, 7)] 

해야한다.

답변

31
result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets] 

자세한 내용은 list comprehensions을 참조하십시오.

14

매우 간단 : 점과 오프셋을 통해

>>> rslt = [] 
>>> for x, y in points: 
...  for dx, dy in offsets: 
...   rslt.append((x+dx, y+dy)) 
... 
>>> rslt 
[(1, 5), (1, 4), (1, 6), (2, 5), (0, 5), (3, 3), (3, 2), (3, 4), (4, 3), (2, 3), (8, 7), (8, 6), (8, 8), (9, 7), (7, 7)] 

주기는 다음 지점에 오프셋을 추가하는 새로운 튜플을 구축 할 수 있습니다.

4

당신이 결과에서 중복 걱정하지 않는 경우 :

result = [] 
for ox, oy in offsets: 
    for px, py in points: 
     result.append((px + ox, py + oy)) 

당신이 결과에서 중복 신경 않는 경우 :

result = set() 
for ox, oy in offsets: 
    for px, py in points: 
     result.add((px + ox, py + oy)) 
8

을 개인적으로, 나는 알록의 답변을 좋아합니다. 그러나 itertools 팬 들면 itertools 기 당량 (파이썬 2.6 이상)이다

import itertools as it 
ps = [(x+dx, y+dy) for (x, y), (dx, dy) in it.product(points, offsets)] 

그러나,이 경우 itertools 용액 간단한보다 하지 빠르다 (실제로는 조금있어 각 오프셋마다 반복적으로 각 x, y의 압축을 풀어야하므로 Alok의 간단한 접근 방식은 각 x, y을 언팩합니다. 그래도 itertools.product는 다른 경우에 중첩 된 루프에 대한 훌륭한 대안이므로 이에 대해 알아야 할 가치가 있습니다. -)

+0

조합 함수 itertools.product, itertools.permutations 및 itertools.combinations는 다음과 같습니다. 새로운 Python 2.6. – musicinmybrain

+0

OK, done (각 파이썬이 각 파이썬 특징을 언급 할 때마다 각 기능이 도입 된 것을 설명하는 것은 매우 귀찮습니다. –