Python如何用列表推导式替代for循环完成递推方差序列计算
错误原因
- 语法错误:你的三目运算符位置写错了,列表推导式内的三元表达式需要写在
for关键字之前,正确的语法格式是[结果1 if 条件 else 结果2 for 变量 in 迭代器],你写在for之后就会触发无效语法报错。 - 逻辑错误:即便修正语法也无法正常运行,列表推导式在完全执行完成前,你要构建的
variances列表始终是空的,rest函数需要引用variances[i-1]的逻辑根本无法生效,列表推导式本身不支持在生成过程中引用自身已产出的元素。
无显式for循环实现方案
你可以用Python标准库functools.reduce实现递推逻辑,全程不需要自己写for循环:
import pandas as pd import numpy as np from functools import reduce returns = pd.Series([1,2,3,4,5]) # 递推计算函数:prev是上一步生成的方差列表,current是当前遍历到的returns元素 def calc_next_var(prev, current): next_val = 0.94 * prev[-1] + 0.06 * (current ** 2) prev.append(next_val) return prev # 初始值设为全序列方差,遍历returns前n-1个元素完成递推 variances = reduce(calc_next_var, returns[:-1], [np.var(returns)]) print(variances)
运行后输出和你预期的结果完全一致:
[2.0, 1.94, 2.0636, 2.4797840000000004, 3.290996960000001]
reduce的底层循环由C实现,完全符合你不使用显式Python for循环的需求。
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

