为了您最初阐明了对输入序列下面的工作的映射功能的问题,是关于有效率,因为它得到停留在Python土地的同时。
from itertools import tee
a = range(10)
a1, a2 = tee(a)
a2.next()
b = map(someFunction, a1, a2)
至于你需要访问前一次迭代的结果扩大的问题 - 这种内心状态的出现在功能概念展开。但是Python不包括展开结构,和一个很好的理由为循环是在这种情况下更具有可读性,最有可能更快了。至于使它变得更加Pythonic,我建议将成对迭代解除为一个函数并创建一个显式循环变量。
def pairwise(seq):
a, b = tee(seq)
b.next()
return izip(a, b)
def unfold_over_pairwise(unfolder, seq, initial):
state = initial
for cur_item, next_item in pairwise(seq):
state = unfolder(state, cur_item, next_item)
yield state
b = [something]
b.extend(unfold_over_pairwise(someFunction, a, initial=b[-1]))
如果循环开销确实是一个问题,那么someFunction必须是非常简单的东西。在这种情况下,它可能是最好写在一个更快的语言的整个循环,如C.
它更快,使这个列表理解? – leon 2009-09-23 14:29:50
您的解决方案很有帮助,我非常感谢。但是,我错过了原来的问题中的东西..你可以再看一遍吗?非常感谢! – leon 2009-09-23 15:04:53
在我的循环中,b的新元素指向b本身(由b [-1])。为此,我认为你的解决方案是不正确的。 – leon 2009-09-23 15:20:26