2017-06-02 2 views
-4

Ich habe eine Frage in python3Python Generator Jump

def generator(string.ascii_lowercase, [0,1,2,3]): 
    pass 

die Lösung sein sollte:

'a', 'b', 'd', 'g', 'k' 

Haben Sie eine Idee, wie ich das umsetzen kann ???

mein 0,1,2,3 ist für den Index springt

+1

Sie könnten mit der Veröffentlichung eines [MCVE] beginnen. Ihr Code funktioniert nicht einmal in seinem aktuellen Zustand. –

+0

@Remolten. Dies ist kein Code. Es ist ein Stummel und eine Anforderung, kein Versuch. –

+1

Stack Overflow ist kein Code-Schreibdienst. Bitte versuchen Sie zuerst, Ihr eigenes Problem zu lösen. Wenn Sie bei einem bestimmten Problem hängen bleiben, können Sie gerne zurückkommen und danach fragen. –

Antwort

0

Sie einen iterator verwenden könnten und verschachtelte Schleifen (einen Iterator, weil es den vorrückenden Schritt vereinfacht) next mit:

def generator(s, steps): 
    it = iter(s)   # create an iterator over the string 
    yield next(it)   # yield the first item and advance the iterator thereby 
    for i in steps:   # go through the list of steps 
     for _ in range(i): # advance the iterator by "i" steps without returning 
      next(it) 
     yield next(it)  # yield again, after the iterator has been advanced. 

, die dem erwarteten Ergebnis liefert:

>>> import string 
>>> list(generator(string.ascii_lowercase, [0,1,2,3])) 
['a', 'b', 'd', 'g', 'k'] 

Mit itertools.islice Sie die Vor- und Nachgeben des nächsten Elements vereinfachen könnte:

Sie Iteratoren können Sie immer verwenden normale Indizierung nicht mag
import itertools 

def generator(s, steps): 
    it = iter(s) 
    yield next(it) 
    for i in steps: 
     yield next(itertools.islice(it, i, None)) 

Falls (vorausgesetzt, Sie haben eine Sequenz, die indiziert werden kann - ein String Werke aber ein Generator würde nicht):

def generator(s, steps): 
    yield s[0] 
    idx = 1 
    for i in steps: 
     idx += i 
     yield s[idx] 
     idx += 1 
+1

Während Sie richtig @ChristianDean sind, verdient die Antwort keinen Fehler Abstimmung. ein einfacher Kommentar würde in diesem Fall genügen. –

+1

Ich habe vor kurzem begonnen, 'collections.deque' mit' maxlen = 0' in Kombination mit 'itertools.islice' zu ​​verwenden, um Iterables zu konsumieren. Etwas wie [dieses] (https://gist.github.com/juanarrivillaga/087e5a2084b1d9c187c9ca3fb7e294a4) –

+0

@ juanpa.arrivillaga Ich weiß nicht, wie ein "Deque" hier helfen würde - aber "islice" vereinfacht das definitiv. Ich habe die Antwort aktualisiert. – MSeifert