2016-02-04 21 views
5

Mam dwie listy list1 i list2 liczb i chcę iterować nad nimi z tymi samymi instrukcjami. W ten sposób:Iterowanie na dwóch listach jeden po drugim

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

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

Ale to wydaje się zbędne. Wiem, że mogę napisać for item in list1 + list2:, ale ma on cenę czasu bieżącego.

Czy można to zrobić bez luźnego czasu?

Odpowiedz

11

Można to zrobić z itertools.chain:

import itertools 

l1 = [1, 2, 3, 4] 

l2 = [5, 6, 7, 8] 

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

Które będzie drukować:

1 2 3 4 5 6 7 8 

Zgodnie z dokumentacją, chain sposób następujący:

Złóż iterator która zwraca elementy z pierwszego iterowalnego, dopóki nie jest exh zniekształcona, a następnie przechodzi do następnej iteracji, aż wszystkie iterały zostaną wyczerpane.

Jeśli masz list w liście itertools.chain.from_iterable jest dostępny:

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

co daje ten sam rezultat.

Jeśli nie chcesz importować moduł do tego, pisząc funkcję jest dość prosta:

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

Wymaga Python 3, dla Pythona 2, tylko yield je z powrotem za pomocą pętla:

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

w uzupełnieniu do poprzedniego, Python 3.5 z jej wysuniętego rozpakowania uogólnień umożliwia również rozpakowaniu na liście dosłownym:

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

chociaż jest nieco szybszy niż l1 + l2 nadal tworzy listę, która jest następnie przesuwana; tylko go traktuj jako ostateczne rozwiązanie.

1

chain roboty, ale jeśli czujesz, że to przesada zaimportować moduł prostu zadzwonić jedną funkcję raz, można replikować jego zachowanie inline:

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

tworzenia (lista1, lista2) krotka jest O (1) w odniesieniu do długości listy, więc powinno to działać korzystnie w porównaniu z łączeniem list razem.

Powiązane problemy