你能帮我写一个返回文本文件中数字部分和的代码吗? 我需要导入文本文件,然后编写一个没有工具等的部分和代码。
我的输入:
4
13
23
21
11
输出应为(不带括号或逗号):4
17
40
61
72
我试图在Python中编写代码,但只能计算总和而不是部分和。如果我对生成器使用+=
运算符,它会给我一个错误!
你能帮我写一个返回文本文件中数字部分和的代码吗? 我需要导入文本文件,然后编写一个没有工具等的部分和代码。
我的输入:
4
13
23
21
11
输出应为(不带括号或逗号):4
17
40
61
72
我试图在Python中编写代码,但只能计算总和而不是部分和。如果我对生成器使用+=
运算符,它会给我一个错误!
嗯,既然每个人似乎都在提供他们最喜欢的用于解决问题的习语,那么Python 3中的itertools.accumulate怎么样?
>>> import itertools
>>> nums = [4, 13, 23, 21, 11]
>>> list(itertools.accumulate(nums))
[4, 17, 40, 61, 72]
total = next(it)
如何处理 []
情况... - Andy Haydenfunc
作为第二个参数 - 我本来期望它与map
和reduce
保持一致(以及几乎所有其他接受函数作为参数的itertools函数)。 - senderlemap
或reduce
,并且真的没有有意义的默认值,但accumulate
通常用于部分求和。 - Karl Knechtel有多种方法可以创建您的部分和序列。我认为最优雅的方法是使用生成器。
def partial_sums(iterable):
total = 0
for i in iterable:
total += i
yield total
您可以这样运行它:nums = [4, 13, 23, 21, 11]
sums = list(partial_sums(nums)) # [ 4, 17, 40, 61, 72]
编辑若要从文件中读取数据值,您可以使用另一个生成器,并将它们链接在一起。以下是我如何实现:
with open("filename.in") as f_in:
# Sums generator that "feeds" from a generator expression that reads the file
sums = partial_sums(int(line) for line in f_in)
# Do output:
for value in sums:
print(value)
# If you need to write to a file, comment the loop above and uncomment this:
# with open("filename.out", "w") as f_out:
# f_out.writelines("%d\n" % value for value in sums)
numpy.cumsum
可以实现你想要的功能。
如果你不使用numpy
,你可以自己编写代码实现。
def cumsum(i):
s = 0
for elt in i:
s += elt
yield s
试试这个:
import numpy as np
input = [ 4, 13, 23, 21, 11 ]
output = []
output.append(input[0])
for i in np.arange(1,len(input)):
output.append(input[i] + input[i-1])
print output
在numpy中使用累计和:
import numpy as np
input = np.array([4, 13, 23, 21 ,11])
output = input.cumsum()
结果:
print output
>>>array([ 4, 17, 40, 61, 72])
或者,如果您需要列表,您可以将输出转换为列表:
output = list(output)
print output
>>>[4, 17, 40, 61, 72]
类似这样的东西:
>>> lst = [4, 13, 23, 21 ,11]
>>> [sum(lst[:i+1]) for i, x in enumerate(lst)]
[4, 17, 40, 61, 72]
sum([4])
,然后是 sum([4,13])
,接着是 sum([4,13,23])
,等等——这样做违背了计算累积和的初衷! - Katriel这是使用reduce的替代方案:
nums = [4, 13, 23, 21, 11]
partial_sum = lambda a, b: a + [a[-1] + b]
sums = reduce(partial_sum, nums[1:], nums[0:1])
reduce(lambda c, x: c + [c[-1] + x], [4, 13, 23, 21, 11], [0])[1:]
- wonder.mice