Wenn mit Generatoren zu tun, wo man einige Kontext benötigen, verwende ich oft die unter Nutzenfunktion eine Schiebefenster-Ansicht geben auf ein Iterator:
import collections, itertools
def window(it, winsize, step=1):
"""Sliding window iterator."""
it=iter(it) # Ensure we have an iterator
l=collections.deque(itertools.islice(it, winsize))
while 1: # Continue till StopIteration gets raised.
yield tuple(l)
for i in range(step):
l.append(it.next())
l.popleft()
Es wird eine Ansicht der Sequenz N Elemente um um generieren Ime, verschiebende Schrittplätze rüber. z.B.
>>> list(window([1,2,3,4,5],3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
Wenn in Look-Ahead mit/hinter Situationen, in denen Sie müssen auch mit Zahlen umgehen können, ohne einen nächsten oder vorherigen Wert zu haben, können Sie Pad, um die Sequenz mit einem entsprechenden Wert wie Keine möchten.
l= range(10)
# Print adjacent numbers
for cur, next in window(l + [None] ,2):
if next is None: print "%d is the last number." % cur
else: print "%d is followed by %d" % (cur,next)
Ich könnte "prev, item = item, next" in diesem Fall tun. –
Um diesen Zyklus unendlich (ohne StopIteration) zu machen, muss man 'von itertools import cycle' und die zweite Zeile ändern in:' iterator = cycle (iterable) ' –
Ist es weniger Pythonic, in diesem Kontext Enumerate zu verwenden? – batbrat