我正在学习Python,我有一种情况,我想使用迭代器中的项。棘手的是,在某些条件下,我想“取消迭代”,也就是说,在循环之前将一个项放回迭代器的前面。
例如,假设我在树上摘苹果。我的果篮只能装10公斤才需要倒空。但我得先摘下每一个苹果,然后再称重,确定这个苹果是否会超过篮子的容量。
在Perl这样的语言中,我可以将apple放回树上,然后让循环表达式重新选择apple:
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket = ();
unshift(@tree, $apple);
} else {
push(@basket, $element);
}
}
或者我也可以使用redo
,它在块的顶部恢复处理,而不计算循环表达式。所以同样的苹果可以在篮子清空后重新加工。
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket = ();
redo;
} else {
push(@basket, $apple);
}
}
对于这种问题,什么才是最有效的解决方案?
当else子句应该总是出现时,为什么要费心取消shift呢?
不管怎样,我很确定Python没有你想要的那种行为。
下面是一个简单的解决方案:
我可以这么说。不要试图将迭代器包装在一个生成器表达式中,该表达式允许您“回溯”或类似的复杂操作,而是使用while循环,就像在Perl中一样!Iterators don't mix very nicely with mutation,任何人。
实现的简单转换(忽略@Patrick的优化):
或者,可以使用类似于
peek
的功能和顺序序列索引:如果不喜欢“simple”参数,请查看上面(链接)线程中提到的
collections.deque
迭代器。相关问题 更多 >
编程相关推荐