2009-12-10 24 views
16

Soy nuevo en Python y no conozco la mejor manera de hacerlo.Agregar tuple a la lista de tuplas en Python

Tengo una lista de tuplas que representan puntos y otra lista que representa las compensaciones. Necesito un conjunto de todas las combinaciones que esto forma. Aquí hay algo de código:

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

Así que mi conjunto de puntos combinados debe ser

[(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)] 

No soy capaz de utilizar NumPy o cualquier otra biblioteca.

Respuesta

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

Para más información, véase el list comprehensions.

14

Muy simple:

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

Ciclo a través de los puntos y las compensaciones, a continuación, construir nuevas tuplas de la adición de las compensaciones a los puntos.

4

Si no se preocupan por los duplicados en el resultado:

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

Si no se preocupan por los duplicados en el resultado:

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

Personalmente, me gusta la respuesta de Alok. Sin embargo, para los amantes de itertools, el equivalente basado en itertools (en Python 2.6 y posterior) es:

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

Sin embargo, en este caso la solución itertools es no más rápido que el sencillo (en realidad es un poco más lento porque necesita desempaquetar cada x, y repetidamente para cada desplazamiento, mientras que el enfoque simple de Alok desempaqueta cada x, y pero una vez). Aún así, itertools.product es una excelente alternativa a los bucles anidados en otros casos, por lo tanto, ¡vale la pena saberlo! -)

+0

También vale la pena señalar que las funciones combinatorias itertools.product, itertools.permutations, y itertools.combinations son nuevo en Python 2.6. – musicinmybrain

+0

OK, listo (aunque es muy agotador explicar qué lanzó cada característica de Python cada vez que mencionas alguna característica de Python, ¡ya sabes! -). –

Cuestiones relacionadas