在 python 中增加列表元素时计算变异总和

Computing sum of variation while increasing list elements in python

我想求和整数列表的倒数,同时用 1/x 一次增加一个值,直到它达到 x/x,并对每个变化都这样做。一个例子:

我的整数是:[2,3]

我想计算这些总和:(1/2+1/3), (1/2+2/3), (1/2+3/3), (2/2+1/ 3), (2/2+2/3), (2/2+3/3)。如果结果是浮点数,这不是问题。

对任何整数列表执行此操作的最佳方法是什么?我尝试先在 float 中通过遍历列表来计算逆函数,但我无法继续下一步。

您可以尝试使用 itertools 中的 product and accumulate:

from itertools import product, accumulate

numbers = [2, 3]
for p in product(*(accumulate([1 / n] * n) for n in numbers)):
    print(sum(p))

正如@KellyBundy 所指出的,您还可以使用 repeat:

from itertools import product, accumulate, repeat

numbers = [2, 3]
for p in product(*(accumulate(repeat(1 / n, n)) for n in numbers)):
    print(sum(p))

如果您担心浮点数不准确(由于求和),您可以用除法替换一些和并使用 fsum:

from itertools import product
from math import fsum

def acc(n): return (k / n for k in range(1, n + 1))

numbers = [2, 3]
for p in product(*(acc(n) for n in numbers)):
    print(fsum(p))

可以从单个总和开始 0,然后使用您的数字一个一个地扩展总和:

xs = [2,3]
expect = [(1/2+1/3), (1/2+2/3), (1/2+3/3), (2/2+1/3), (2/2+2/3), (2/2+3/3)]

sums = [0]
for x in xs:
    sums = [s + i/x
            for s in sums
            for i in range(1, x+1)]

print(sums == expect)

输出(Try it online!):

True