2016-02-04 14 views
5

Ho due elenchi list1 e list2 di numeri e voglio eseguirne l'iterazione con le stesse istruzioni. Mi piace:Iterating su due elenchi uno dopo l'altro

for item in list1: 
    print(item.amount) 
    print(item.total_amount) 

for item in list2: 
    print(item.amount) 
    print(item.total_amount) 

Ma questo sembra ridondante. So di poter scrivere for item in list1 + list2:, ma ha un prezzo di esecuzione.

C'è un modo per farlo senza perdere tempo?

risposta

11

Questo può essere fatto con itertools.chain:

import itertools 

l1 = [1, 2, 3, 4] 

l2 = [5, 6, 7, 8] 

for i in itertools.chain(l1, l2): 
    print(i, end = " ") 

che stamperà:

1 2 3 4 5 6 7 8 

Come per la documentazione, chain esegue le seguenti operazioni:

Fai iteratore che restituisce elementi dal primo iterabile fino a quando non è exh spossato, quindi procede al successivo iterabile, fino a quando tutti i iterables sono esauriti.

Se avete i vostri elenchi in un elenco, itertools.chain.from_iterable è disponibile:

l = [l1, l2] 
for i in itertools.chain.from_iterable(l): 
    print(i, end= " ") 

che produce lo stesso risultato.

Se non si desidera importare un modulo per questo, scrivendo una funzione per esso è abbastanza straight-forward:

def custom_chain(*it): 
    for iterab in it: 
     yield from iterab 

Questo richiede Python 3, per Python 2, appena yield indietro utilizzando un ciclo:

def custom_chain(*it): 
    for iterab in it: 
     for val in iterab: 
      yield val 

in aggiunta alla precedente, Python 3.5 con le sue generalizzazioni disimballaggio estese, permette anche di disimballaggio nella lista letterale:

for i in [*l1, *l2]: 
    print(i, end=' ') 

sebbene questo sia leggermente più veloce di l1 + l2 costruisce ancora un elenco che viene quindi gettato; prendilo solo come soluzione finale.

1

chain opere, ma se si sente che è eccessivo per importare un modulo solo per chiamare una sola funzione, una volta, è possibile replicare la sua linea comportamento:

for seq in (list1, list2): 
    for item in seq: 
    print(item.amount) 
    print(item.total_amount) 

Creazione del (Lista1, Lista2) tupla è O (1) per quanto riguarda la lunghezza della lista, quindi dovrebbe funzionare favorevolmente rispetto alla concatenazione delle liste insieme.