You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在列表推导式中访问前一个计算项?怎样将递推迭代写成单行?

Python递推列表的单行写法

对于你提到的两种递推生成列表的场景,都可以用itertools.accumulate来实现简洁的单行写法,下面分别给出对应方案:

场景1:仅依赖前一个元素

原循环代码:

new_list = [0]
for _ in range(N):
    new_list.append(func(new_list[-1]))

单行实现(需导入itertools):

from itertools import accumulate, repeat

new_list = list(accumulate(repeat(None, N), lambda prev, _: func(prev), initial=0))

原理:repeat(None, N)生成N个占位符供循环迭代,accumulate从初始值0出发,每次用前一个结果调用func,最终把所有中间结果(包括初始值)转成列表,和原代码输出完全一致。

场景2:依赖循环变量t和前一个元素

原循环代码:

new_list = [0]
for t in range(N):
    new_list.append(func(t, new_list[-1]))

单行实现(需导入itertools):

from itertools import accumulate, count, repeat

new_list = list(accumulate(zip(count(), repeat(None, N)), lambda prev, curr: func(curr[0], prev), initial=0))

原理:count()生成从0开始的递增序列(对应循环变量t),和repeat(None, N)配对后,accumulate每次用当前的t(curr[0])和前一个元素(prev)调用func,最终生成包含初始值的完整列表。

如果不想导入库,也可以用这种直白但效率稍低的单行写法(以场景1为例):

new_list = [0] + [func(new_list[-1]) for _ in range(N)]

不过这种写法会在列表推导中反复引用new_list,可读性和性能都不如accumulate方案。

内容的提问来源于stack exchange,提问作者Uwe.Schneider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:30:53