爲了您最初闡明瞭對輸入序列下面的工作的映射功能的問題,是關於有效率,因爲它得到停留在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