Lassen Sie uns sagen, dass ich eine Sequenz haben, die so geht:Partitionieren mit Prädikaten durch nur einen iterable
seq = (1, 1, 1, 1, 4, 6, 8, 4, 3, 3, 3,)
Einige beliebige Anzahl von 1s, durch eine beliebige Anzahl von geraden Zahlen, gefolgt von einigen 3s gefolgt. Wenn ich versuche, es wie so aufzuspalten:
it = iter(seq)
ones = list(takewhile(lambda x: x == 1, it))
evens = list(takewhile(lambda x: x%2 == 0, it))
threes = list(takewhile(lambda x: x == 3, it))
Diese fast klappt ... außer ich die erste gerade Zahl und die ersten drei verpassen, da sie bereits von takewhile
verbraucht wird. Gibt es eine Möglichkeit, diese Art von Partitionierung durchzuführen, indem der Iterator einfach vorwärts bewegt wird, Prädikat durch Prädikat?
Ich denke, du werde dieses Problem mit allem, was haben, in 'itertools' weil es _has_ auf dem nächsten Wert, um zu sehen, ob es das Prädikat übereinstimmt, aber das verbraucht es, wie Sie sagte. Wenn Sie eine benutzerdefinierte Lösung geschrieben haben, könnten Sie eine Funktion schreiben, die eine Liste und den ersten nicht übereinstimmenden Wert zurückgibt, anstatt sie zu löschen. Wenn Sie jedoch bei Generatoren bleiben müssen, müssen Sie möglicherweise kreativ werden oder eine Klasse zum Speichern verwenden. –
Haben Sie "itertools.groupby" angeschaut? – BrenBarn
@BrenBarn Ich habe mehrere, möglicherweise nicht disjunkte Prädikate. Ich gruppiere nicht nach einem Schlüssel. – Barry