PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Iteratoren mit .prev/.next in python?



Sid
18-03-2006, 00:00
Hallo,
ich hab grad ein kleines Problem mit Python: Wie kann ich beim durchlaufen einer liste auf das nächste bzw. vorherige element relativ zum aktuellen zugreifen? Normalerweise iteriert man ja per for bla in blubb, das ist auch gut so, nur bräuchte ich da noch ein bla.next und bla.prev.

Hintergrund ist, dass ich ein Polygon hab und da verschiedene Schnittpunkte berechnen will, und dank der Floatungenauigkeit schneiden sich da manchmal Sachen, die sich besser nicht schneiden sollten, bevorzugt schneiden sich die Verbindungen von der Aktuellen vertex zur nächsten bzw. der vorherigen. Da die sich in meinem Fall aber eigentlich mit gar nichts schneiden können, es aber dennoch tun, würd ich die gern ganz einfach aus der Abfrage ausschließen. Dazu muss ich aber auch die Koordinaten der nächsten bzw. vorherigen Vertex wissen.

Danke,
sid

RapidMax
19-03-2006, 01:37
Die Iteratoren in Python kennen nur next(), damit mein ich Listen-Iteratoren explizit mit iter(List) erzeugt und Generatoren (yield in Funktionen).

Für Listen ist ein vor- und zurückspul Iterator schnell selber gecodet:



class TwoDirectionIter(object):
def __init__(self, sequence):
self.sequence = sequence
self.position = 0
def __iter__(self):
return self
def next(self):
if self.position >= len(self.sequence):
self.position = len(self.sequence) - 1
raise StopIteration
self.position += 1
return self.sequence[self.position-1]
def prev(self):
if self.position <= 0:
self.position = 0
raise StopIteration
self.position -= 1
return self.sequence[self.position+1]


Dieser Iterator kann einerseits normal in einer for-Schlaufe verwendet werden:


l = [1, 2, 3, 4, 5]
for i in TwoDirectionIter(l):
print i


Und andererseits auch von Hand und dann auch Rückwärts angewendet werden:


try:
while not done:
d = i.next()
...
if rewind_condition:
i.prev()
except StopIteration:
pass


Gruss, Andy