Для вашей изначально заявленной проблемы сопоставления функции над парами входной последовательности следующее будет работать и примерно так же эффективно, как и во время пребывания на земле 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 должен быть чем-то действительно простым. В этом случае, вероятно, лучше, чтобы написать весь цикл в более быстром языке, такие как С.
ли это быстрее, чтобы сделать этот список понимание? – leon
Ваше решение полезно, я очень благодарен. Однако я пропустил что-то в оригинальной проблеме. Можете ли вы снова взглянуть на нее? Спасибо, много! – leon
в моем цикле новый элемент b относится к самому b (через b [-1]). С этой целью, я думаю, ваше решение неверно. – leon