gpt4 book ai didi

Pythonic 相当于 unshift 或 redo?

转载 作者:太空狗 更新时间:2023-10-29 17:36:12 26 4
gpt4 key购买 nike

我正在学习 Python,我遇到了一种情况,我想使用迭代器中的项目。棘手的部分是在某些条件下,我想“取消迭代”。也就是说,在我循环之前将一个项目放回迭代器的前面。

例如,假设我正在从树上摘苹果。我的果篮只能装10公斤才需要清空。但是我必须先摘下每个苹果,然后才能称重并确定这个苹果是否会超出篮子的容量。

在像 Perl 这样的语言中,我可以unshift() 把苹果放回树上,然后让循环表达式重新摘苹果:

while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket = ();
unshift(@tree, $apple);
} else {
push(@basket, $element);
}
}

否则我也可以使用 redo,它在 block 的顶部恢复处理,而不评估循环表达式。因此,在篮子清空后,可以重新加工同一个苹果。

while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket = ();
redo;
} else {
push(@basket, $apple);
}
}

对于此类问题,最Python 的解决方案是什么?

最佳答案

I'm learning Python, and I have a situation where I want to consume items from an iterator. The tricky part is that under certain conditions, I want to "un-iterate." That is, put an item back onto the front of the iterator before I loop.

这是一个简单的解决方案:

class MyIterator(object):   # undo-able iterator wrapper
def __init__(self, iterable):
super(MyIterator, self).__init__()
self.iterator = iter(iterable)
self.stack = []

def __iter__(self):
return self

def next(self):
if self.stack:
return self.stack.pop()
return self.iterator.next() # Raises StopIteration eventually

def undo(self, item):
self.stack.append(item)
for i in  MyIterator(xrange(5)): print i
0
1
2
3
4
rng = MyIterator(xrange(5))
rng.next()
0
rng.next()
1
rng.undo(1)
rng.next()
1

关于Pythonic 相当于 unshift 或 redo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/418915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com