2017-01-31 1 views
0

Ich habe eine Liste, und ich schaue, um durch zu gehen. Das Problem ist, dass ich nicht daran interessiert bin, Elemente einzeln nacheinander durchzulaufen, sondern gleichzeitig durch Elemente auf einmal zu wechseln.`Itertools.cycle`: Pythisch am meisten, um mehrere Schritte zu machen?

Zum Beispiel, wenn meine Liste l = ["a", "b", "c", "d"] ist, dann würde ich die folgende Ausgabe will:

>>> from itertools import cycle 
>>> gen = cycle(l) 
>>> next(gen, 4) # I know this doesn't work -- take as pseudocode 
d 
>>> next(gen, 3) 
c 

Ich weiß, dass ich dies mit so etwas wie erreichen kann:

def generator_step(g, n): 
    for item in range(n): 
     next(g) 
    return item 
+0

Soll das 4 Schritte sein? Das sind keine 4 Schritte beim zweiten Anruf. – user2357112

+0

@ user2357112 behoben, sorry – Newb

+1

Sie möchten vielleicht nur eine Liste und einen Index für konstante Zeitsprünge pflegen. Sie können das nicht mit einem itertools.cycle-Iterator bekommen. ("collections.deque" und seine "rotate" -Methode könnten ebenfalls eine Überlegung wert sein, aber das ist keine konstante Zeit.) – user2357112

Antwort

1

Sie itertools.islice verwenden können um das Zyklusobjekt vor dem nächsten Aufruf fortzubewegen:

from itertools import cycle, islice 

c = cycle(l) 
n = 4 
print(next(islice(c, n-1, n))) 
# d 
+0

Warum nimmt Ihre 'islice'-Funktion drei Argumente an? Ich finde die Ausgabe mit 'islice (c, n)' als befriedigend. – Newb

+0

Das gibt nur das erste Element in der Scheibe, wenn Sie 'next' aufrufen, was nicht das ist, was Sie wollen –

1

In der Dokumentation für itertools gibt es eine handy recipe for precisely this problem.

def consume(iterator, n): 
    "Advance the iterator n-steps ahead. If n is none, consume entirely." 
    # Use functions that consume iterators at C speed. 
    if n is None: 
     # feed the entire iterator into a zero-length deque 
     collections.deque(iterator, maxlen=0) 
    else: 
     # advance to the empty slice starting at position n 
     next(islice(iterator, n, n), None) 
Verwandte Themen