2

Ich habe jetzt eine Zeit lang mit dieser Datenstruktur geklebt worden:verschachtelte Iterables mit Summieren Karten reduzieren/itertools

iter([iter([1,0]),iter([1,1]),iter([0,0])]) 

Ich mag/zusammenzufassen der Innen die meisten Elemente erhalten unter Verwendung von Karten reduzieren Itertools.

Ich bin auf die Antwort bekommen können ziemlich schnell für Loops:

outer_iter = iter([iter([1,0]),iter([1,1]),iter([0,0])]) 

for inner_iter in outer_iter: 
    for inner_list in inner_iter: 
     total = total + inner_list 

ich den Code habe Schwierigkeiten zu „übersetzen“.

+0

was hast du probiert? –

+0

Können die Iterables verschachtelt werden * beliebig * tief oder nur zwei Ebenen? –

Antwort

2

Wenn die Daten verschachtelt ist zwei Ebenen tief, können wir die chain Funktion die Iterables zusammen, verketten und dann lassen sum(..) die Summe der iterable berechnen. So:

from itertools import chain 

sum(chain.from_iterable(outer_iter))

chain.from_iterable nimmt als Eingabe einen von iterable Iterables, und wandelt diese in ein iterable, die die Elemente aus dem Iterables einen nach dem anderen lazily erhält. Wir können das iterierbare Entpacken unter chain verwenden, aber wenn das äußere Iterable eine unendliche Liste ist, würde der Algorithmus hängen bleiben (und schließlich keinen Speicher mehr).

+0

etwas, was ich beim Spielen mit diesem Code bemerkt habe: https://StackOverflow.com/questions/29403401/python-for-loop-and-iterator-behavior – lainglo

+0

@ lainglo: Ja, der Iterator ist tatsächlich verbraucht. Aber es gibt nicht wirklich eine Möglichkeit, den Iterator nicht zu konsumieren. Sie können 'tee' usw. verwenden, die aus einem Iterator (durch die Verwendung von Shared Memory) zwei erzeugen –

Verwandte Themen