2016-02-04 2 views
5

Ich habe zwei Listen list1 und list2 von Zahlen, und ich möchte über sie mit den gleichen Anweisungen zu iterieren. Wie folgt:Iterieren über zwei Listen nacheinander

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

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

Aber das fühlt sich redundant an. Ich weiß, ich kann for item in list1 + list2: schreiben, aber es hat einen Preis für die Laufzeit.

Gibt es einen Weg, ohne Zeit zu verlieren?

Antwort

11

Dies kann mit itertools.chain erfolgen:

1 2 3 4 5 6 7 8 

Gemäß der Dokumentation, chain führt Folgendes:

import itertools 

l1 = [1, 2, 3, 4] 

l2 = [5, 6, 7, 8] 

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

Welche gedruckt werden

einen Iterator Stellen das gibt Elemente vom ersten iterablen bis exh zurück austed, geht dann zum nächsten iterablen Schritt über, bis alle Iterables erschöpft sind.

Wenn Sie Ihre Listen in einer Liste haben, ist itertools.chain.from_iterable verfügbar:

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

die das gleiche Ergebnis liefert.

Wenn Sie nicht möchten, dass ein Modul für diese importieren, eine Funktion zu schreiben für sie ziemlich geradlinig ist:

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

Dies erfordert Python 3 für Python 2, nur yield sie wieder ein mit Loop:

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

Zusätzlich zu dem vorherigen, Python 3.5 mit seinen erweiterten Auspackstation Verallgemeinerungen, ermöglicht auch Literal in der Liste Auspacken:

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

obwohl dies etwas schneller als l1 + l2 ist, erstellt es immer noch eine Liste, die dann geworfen wird; nur als endgültige Lösung.

1

chain funktioniert, aber wenn Sie das Gefühl, dass es übertrieben, ein Modul importieren nur einmal eine einzige Funktion aufrufen, können Sie sein Verhalten Inline replizieren:

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

Erstellen der (list1, list2) Tupel O (1) in Bezug auf die Listenlänge, so sollte es im Vergleich zur Verkettung der Listen vorteilhaft sein.