2015-05-07 9 views
8

non posso usare itertoolsContinuare fino a quando tutti gli iteratori sono fatte Python

Così la codifica sembra abbastanza semplice, ma sto avendo difficoltà a pensare dell'algoritmo per mantenere un generatore di esecuzione fino a quando tutte le iterazioni sono stati elaborati completamente.

L'idea della funzione è di prendere 2 iterables come parametri come questa ...

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

E ciò che fa è produrre questi valori ...

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

Tuttavia, nel caso in cui il secondo iterabile finisca per primo tra gli elementi, la funzione semplicemente itera il valore rimanente una volta ...

Così i valori rimanenti sarebbero iterate in questo modo:

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])] 

Sto avendo difficoltà a ignorare il primo StopIteration e continuando a completamento.

+0

Beh questo è dove sto avendo problemi con pure. Non so come ottenere l'iterazione per continuare insieme contemporaneamente in modo che a ottiene il valore 1 e b ottiene il valore 2. – FlyingBumble

+0

cosa dovrebbe succedere con d ed e? –

+0

Quando l'iterabile con i numeri si esaurisce, i restanti iterabili nel primo devono essere restituiti solo una volta ciascuno. – FlyingBumble

risposta

18

utilizzare un valore predefinito di 1 per il prossimo in modo da stampare le lettere di almeno una volta:

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 

uscita:

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

Grazie a questo ho aiutato un sacco, ed è stato facile capire dove ho sbagliato. Non sapevo che si potesse assegnare un valore predefinito ad un iterabile se fallisse. – FlyingBumble

+0

@FlyingBumble, no prob, era un problema interessante. Sì, il secondo valore successivo è un valore predefinito che eviterà una StopIteration e ci permetterà anche di vedere ogni stringa almeno una volta. –

2

Leggere la documentazione per zip(). Dice: "zip() deve essere usato solo con input di lunghezza non uguale quando non ti interessa il finale, valori non corrispondenti dai più lunghi iterabili.Se quei valori sono importanti, usa invece itertools.zip_longest()."

Problemi correlati