Ich lerne Python, und ich habe eine Situation, in der ich Elemente von einem Iterator konsumieren möchte. Der schwierige Teil ist, dass ich unter bestimmten Bedingungen "un-iterieren" möchte. Das bedeutet, dass ein Element vor der Schleife wieder auf die Vorderseite des Iterators gesetzt wird.Pythonic Äquivalent von Unshift oder Redo?
Nehmen wir zum Beispiel an, ich pflücke Äpfel von einem Baum. Mein Obstkorb kann nur 10kg fassen, bevor er entleert werden muss. Aber ich muss jeden Apfel pflücken, bevor ich ihn wiegen kann und feststellen, ob dieser Apfel die Kapazität des Korbs übersteigen würde.
In einer Sprache wie Perl, könnte ich den Apfel zurück auf den Baum, unshift()
und dann die Schleife Ausdruck lassen den Apfel wieder holen:
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket =();
unshift(@tree, $apple);
} else {
push(@basket, $element);
}
}
Oder kann ich auch redo
verwenden, die Verarbeitung wird fortgesetzt an der Spitze des Blocks, ohne den Schleifenausdruck zu bewerten. So kann derselbe Apfel nach dem Entleeren des Korbes erneut verarbeitet werden.
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket =();
redo;
} else {
push(@basket, $apple);
}
}
Was wäre die pythonic Lösung für diese Art von Problem?
wenn $ wt> 10, dann gibt es eine unendliche Schleife (das erste Beispiel den gesamten Speicher isst, hält die zweite gerade nie). – jfs
@ J.F .: Du hast Recht, aber in diesem Fall kann man davon ausgehen, dass kein einzelner Apfel 10kg überschreiten wird. –