2015-05-07 9 views
8

I itertools nichtweiter, bis alle Iteratoren Python getan werden

So ist die Codierung recht einfach verwenden können scheint, aber ich habe Probleme beim Denken des Algorithmus läuft, einen Generator zu halten, bis alle Iterationen vollständig verarbeitet wurden.

Die Idee der Funktion 2 Iterables als Parameter wie folgt ...

(['a', 'b', 'c', 'd', 'e'], [1,2,5])

zu nehmen ist

Und was sie tut, ist, diese Werte ergeben ...

a, b, b, c, c, c, c, c

Für den Fall, dass das zweite Iterable zuerst keine Elemente mehr enthält, iteriert die Funktion den verbleibenden Wert einfach einmal ...

So bleiben die übrigen Werte würden wie folgt wiederholt werden:

d, e

def iteration(letters, numbers): 
    times = 0 
    for x,y in zip(letters, numbers): 
     try: 
      for z in range(y): 
       yield x 
     except: 
      continue 

[print(x) for x in iteration(['a', 'b', 'c', 'd'], [1,2,3])] 

Schwierigkeiten Ich habe die erste StopIteration und Weiterbildung ignoriert bis zur Fertigstellung.

+0

Nun, das ist, wo ich Probleme mit als auch mit. Ich weiß nicht, wie ich die Iteration simultan fortsetzen kann, damit a den Wert 1 erhält und b den Wert 2 erhält. – FlyingBumble

+0

was soll mit d und e passieren? –

+0

Wenn das iterierbare mit den Zahlen abläuft, sollten die verbleibenden iterables im ersten nur jeweils einmal zurückgegeben werden. – FlyingBumble

Antwort

18

einen Standardwert von 1 für nächsten Einsatz, so dass Sie die Buchstaben mindestens einmal drucken:

def iteration(letters, numbers): 
    # create iterator from numbers 
    it = iter(numbers) 
    # get every letter 
    for x in letters: 
     # either print in range passed or default range of 1 
     for z in range(next(it, 1)): 
      yield x 

Ausgang:

In [60]: for s in iteration(['a', 'b', 'c', 'd', 'e'], [1,2,5]): 
    ....:  print(s) 
    ....:  
a 
b 
b 
c 
c 
c 
c 
c 
d 
e 
+0

Danke, das half einem Haufen, und es war leicht zu verstehen, wo ich falsch gelaufen bin. Ich wusste nicht, dass Sie einem Iterablen einen Standardwert zuweisen können, wenn dieser fehlschlägt. – FlyingBumble

+0

@FlyingBumble, kein Problem, es war ein interessantes Problem. Ja, der zweite Wert von next ist ein Standardwert, der eine StopIteration vermeidet und es uns außerdem ermöglicht, jeden String mindestens einmal zu sehen. –

2

Lesen Sie die Dokumentation für zip(). Es heißt: "zip() sollte nur mit ungleichen Längeneingaben verwendet werden, wenn Sie keine nachlaufenden, nicht übereinstimmenden Werte aus den längeren Iterablen interessieren. Wenn diese Werte wichtig sind, verwenden Sie stattdessen itertools.zip_longest()."

Verwandte Themen