在 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
我想求和整数列表的倒数,同时用 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