轮盘赌算法中的一行超人写法

假设有如下适应度概率密度:

>>> fitness = [5, 6, 7, 1, 2, 3]
>>> fitness_sum = sum(fitness)
>>> fitness_proportion = [fitness[i] / fitness_sum for i in range(len(fitness))]
>>> fitness_proportion
[0.20833333333333334, 0.25, 0.2916666666666667, 0.041666666666666664, 0.08333333333333333, 0.125]

我们需要创建一个轮盘,将 fitness_proportion 累加起来生成一个新的列表,逻辑如下:
首先将 fitness_proportion 的第一项作为新列表的第一项,前两项的和作为新列表的第二项,前三项的和作为新列表的第三项,以此类推。

一般写法如下:

pie_fitness = []
cumsum =  0.0
for i in range(len(fitness_proportion)):
    pie_fitness.append(cumsum + fitness_proportion[i])
    cumsum += fitness_proportion[i]

输出 pie_fitness 看看:

>>> pie_fitness
[0.20833333333333334, 0.45833333333333337, 0.75, 0.7916666666666666, 0.875, 1.0]
>>>

一行超人写法如下:

from functools import reduce

pie_fitness = [reduce(lambda x, y: x + y, fitness_proportion[:i]) for i in range(1, len(fitness_proportion) + 1)]

比较暴力,能看懂的就看看吧,不解释了。
如果没有性能要求的情况下,尽量按照一般写法来,一行的可读性毕竟还是差了点。