2009-12-10 19 views
16

Jestem nowy w Pythonie i nie wiem, jak to zrobić najlepiej.Dodaj tuple do listy krotek w Pythonie

Mam listę krotek, które reprezentują punkty i inną listę reprezentującą przesunięcia. Potrzebuję zestawu wszystkich kombinacji, które to tworzy. Oto niektóre kodu:

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

Więc mój zbiór punktów połączonych powinny być

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

nie jestem w stanie wykorzystać NumPy lub innych bibliotek.

Odpowiedz

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

Aby uzyskać więcej informacji, zobacz list comprehensions.

14

Całkiem proste:

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

Przechodzić punkty i przesunięć, a następnie budować nowe krotki dodanie przesunięcia do punktów.

4

Jeśli nie dbają o duplikaty w wyniku:

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

Jeśli dbasz o duplikaty w wyniku:

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

Osobiście lubię odpowiedź ALOK użytkownika. Jednak dla fanów itertools, odpowiednik itertools oparte (w Pythonie 2.6 i nowsze) jest:

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

Jednak w tym przypadku rozwiązanie itertools jest nie szybciej niż prostego jednego (to faktycznie tad wolniej, ponieważ musi rozpakowywać każdy numer x, y dla każdego przesunięcia, podczas gdy proste podejście Aloka rozpakowuje każdy x, y, ale raz). Mimo to, itertools.product jest doskonałą alternatywą dla zagnieżdżonych pętli w innych przypadkach, więc warto o tym wiedzieć! -)

+0

Warto również zauważyć, że kombinatoryczne funkcje itertools.product, itertools.permutations i itertools.combinations są nowość w Pythonie 2.6. – musicinmybrain

+0

OK, zrobione (chociaż bardzo męczące jest wyjaśnienie, co wypuszczono w Pythonie, każda z funkcji została wprowadzona za każdym razem, gdy w ogóle wspominałeś o dowolnej funkcji Pythona, wiesz! -). –