2009-12-10 13 views
16

Ich bin neu bei Python und weiß nicht den besten Weg, dies zu tun.Hinzufügen von Tupel zu einer Liste von Tupeln in Python

Ich habe eine Liste von Tupeln, die Punkte und eine andere Liste darstellen, die Offsets darstellt. Ich brauche eine Menge von all den Kombinationen, die diese bilden. Hier einige Code:

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

meine Reihe von kombinierten Punkte sollten also

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

ich nicht in der Lage bin NumPy oder andere Bibliotheken zu verwenden.

Antwort

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

Weitere Informationen finden Sie unter list comprehensions.

14

Ganz einfach:

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

Zyklus durch die Punkte und der Offsets, dann baut neue Tupel der Zugabe der Offsets zu den Punkten.

4

Wenn Sie nicht über Duplikate im Ergebnis ist es egal:

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

Wenn Sie Duplikate im Ergebnis ist es egal:

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

Ich persönlich mag Alok Antwort. Doch für Fans von itertools, die itertools-basierten äquivalent (in Python 2.6 und höher) ist:

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

jedoch in diesem Fall die itertools Lösung nicht schneller als die einfachen (es ist eigentlich ein bisschen langsamer, weil es jeden x, y wiederholt für jeden Offset entpacken muss, während Aloks einfacher Ansatz jedes x, y aber einmal entpackt). Dennoch, itertools.product ist eine ausgezeichnete Alternative zu verschachtelten Schleifen in anderen Fällen, so ist es wert, darüber zu wissen! -)

+0

Es ist auch erwähnenswert, dass die kombinatorischen Funktionen itertools.product, itertools.permutations, und iertools.combinations sind neu in Python 2.6. – musicinmybrain

+0

OK, fertig (obwohl es sehr ermüdend ist zu erklären, was Python veröffentlicht hat, jedes Feature wurde jedes Mal eingeführt, wenn du überhaupt eine Python-Funktion erwähnst, weißt du! -). –

Verwandte Themen