递归函数会有所帮助。
input_list = [ 1, 2, 3, 4, 5]
def cumprod(ls, i=None):
i = len(ls)-1 if i is None else i
if i == 0:
return 1
return ls[i] * cumprod(ls, i-1)
output_list = [cumprod(input_list, i) for i in range(len(input_list))]
output_list 的值为 [1, 2, 6, 24, 120]
此方法在python3.8中可以使用海象算子进行压缩
input_list = [ 1, 2, 3, 4, 5]
def cumprod_inline(ls, i=None):
return 1 if (i := len(ls)-1 if i is None else i) == 0 else ls[i] * cumprod_inline(ls, i-1)
output_list = [cumprod_inline(input_list, i) for i in range(len(input_list))]
output_list 的值为 [1, 2, 6, 24, 120]
因为您打算在列表理解中使用它,所以无需为 i 参数提供默认值。这样就无需检查 i 是否为 None。
input_list = [ 1, 2, 3, 4, 5]
def cumprod_inline_nodefault(ls, i):
return 1 if i == 0 else ls[i] * cumprod_inline_nodefault(ls, i-1)
output_list = [cumprod_inline_nodefault(input_list, i) for i in range(len(input_list))]
output_list 的值为 [1, 2, 6, 24, 120]
最后,如果您真的想将其保留为单个、自包含的列表理解行,您可以按照方法说明 here 使用递归 lambda 调用
input_list = [ 1, 2, 3, 4, 5]
output_list = [(lambda func, x, y: func(func,x,y))(lambda func, ls, i: 1 if i == 0 else ls[i] * func(func, ls, i-1),input_list,i) for i in range(len(input_list))]
output_list 的值为 [1, 2, 6, 24, 120]
它完全是过度设计的,几乎看不懂,但是,嘿!它有效,只是为了好玩。