这个累计和函数有什么问题,有没有更好的方法来编写这个函数?
What is wrong with this cumulative sum function, and is there a better way to write the function?
函数:
def comulative_sum(arr):
arr1 = []
for number in range(1, len(arr)):
sum1 = 0
for number1 in range(0, arr[number]):
sum1 += number1
arr1.append(sum1)
return arr1
arr = [1, 2, 3, 4]
print(comulative_sum(arr))
输出:
[3, 6, 10]
预期输出:
[1, 3, 6, 10]
我试过切片 ([1:], [0:number) 而不是范围函数。仍然没有结果。
多个问题:
- 在第一个循环中,您需要调整范围直到
len() + 1
,因为最后一个数字是 len()
,然后第二个循环中的最后一个数字将是 len() - 1
,这也是索引。
- 在第二个循环中,不是一直到
number
,而是一直到数组中的原始数字。
固定码:
def comulative_sum(arr):
arr1 = []
for number in range(1, len(arr)+1):
sum1 = 0
for number1 in range(0, number):
sum1 += arr[number1]
arr1.append(sum1)
return arr1
arr = [1, 2, 3, 4]
print(comulative_sum(arr))
如果您希望改进此代码而不使用 built-in 累积,您可以这样做:
def comulative_sum(input_list):
output = []
sum_ = 0 # The underscore is to avoid renaming the built-in sum()
for i in input_list:
sum_ += i
output.append(sum_)
return output
input_list = [1, 2, 3, 4]
print(comulative_sum(input_list))
优点:
- 更好的变量命名。
- 更少的代码嵌套。
- 整体代码更容易阅读。
- 更快的代码(无需在每次迭代时重新计算所有内容)
for循环只会处理从索引1到数组末尾的数字。因此索引 0 将被忽略。
工作函数:
def comulative_sum(arr):
arr1 = []
for number in arr[:len(arr)]:
sum1 = 0
for number1 in arr[0:number]:
sum1 += number1
arr1.append(sum1)
return arr1
arr = [1, 2, 3, 4]
print(comulative_sum(arr))
唯一改变的是第一个和第二个 for 循环中的索引。
编写此函数的更好方法是简单地使用 itertools.accumulate()
,它确实是这样做的:
>>> import itertools
>>> print(list(itertools.accumulate([1,2,3,4]))
[1, 3, 6, 10]
你不需要循环两次
def cum_sum(x):
result = []
current_sum = 0
for value in x:
current_sum += value
result.append(current_sum)
return result
我内置了您的解决方案。此版本依赖于 Python 通过索引的循环,并且还解决了可能的数字“0”。
def cumulative_sum(arr):
arr1 = []
# Python does the hard work for you, it loops through each value on the list
for value in arr:
sum1 = 0
# Range is going to have a list as follows [0, ... , value-1]
for number1 in range(0, value):
sum1 += number1
# Adding 'value' to sum1 because the loop did not add the last value
arr1.append(sum1+value)
return arr1
arr = [1, 3, 6, 10]
# Calling the function with 'print' to make sure the results are displayed
print(cumulative_sum(arr))
函数:
def comulative_sum(arr):
arr1 = []
for number in range(1, len(arr)):
sum1 = 0
for number1 in range(0, arr[number]):
sum1 += number1
arr1.append(sum1)
return arr1
arr = [1, 2, 3, 4]
print(comulative_sum(arr))
输出:
[3, 6, 10]
预期输出:
[1, 3, 6, 10]
我试过切片 ([1:], [0:number) 而不是范围函数。仍然没有结果。
多个问题:
- 在第一个循环中,您需要调整范围直到
len() + 1
,因为最后一个数字是len()
,然后第二个循环中的最后一个数字将是len() - 1
,这也是索引。 - 在第二个循环中,不是一直到
number
,而是一直到数组中的原始数字。
固定码:
def comulative_sum(arr):
arr1 = []
for number in range(1, len(arr)+1):
sum1 = 0
for number1 in range(0, number):
sum1 += arr[number1]
arr1.append(sum1)
return arr1
arr = [1, 2, 3, 4]
print(comulative_sum(arr))
如果您希望改进此代码而不使用 built-in 累积,您可以这样做:
def comulative_sum(input_list):
output = []
sum_ = 0 # The underscore is to avoid renaming the built-in sum()
for i in input_list:
sum_ += i
output.append(sum_)
return output
input_list = [1, 2, 3, 4]
print(comulative_sum(input_list))
优点:
- 更好的变量命名。
- 更少的代码嵌套。
- 整体代码更容易阅读。
- 更快的代码(无需在每次迭代时重新计算所有内容)
for循环只会处理从索引1到数组末尾的数字。因此索引 0 将被忽略。
工作函数:
def comulative_sum(arr):
arr1 = []
for number in arr[:len(arr)]:
sum1 = 0
for number1 in arr[0:number]:
sum1 += number1
arr1.append(sum1)
return arr1
arr = [1, 2, 3, 4]
print(comulative_sum(arr))
唯一改变的是第一个和第二个 for 循环中的索引。
编写此函数的更好方法是简单地使用 itertools.accumulate()
,它确实是这样做的:
>>> import itertools
>>> print(list(itertools.accumulate([1,2,3,4]))
[1, 3, 6, 10]
你不需要循环两次
def cum_sum(x):
result = []
current_sum = 0
for value in x:
current_sum += value
result.append(current_sum)
return result
我内置了您的解决方案。此版本依赖于 Python 通过索引的循环,并且还解决了可能的数字“0”。
def cumulative_sum(arr):
arr1 = []
# Python does the hard work for you, it loops through each value on the list
for value in arr:
sum1 = 0
# Range is going to have a list as follows [0, ... , value-1]
for number1 in range(0, value):
sum1 += number1
# Adding 'value' to sum1 because the loop did not add the last value
arr1.append(sum1+value)
return arr1
arr = [1, 3, 6, 10]
# Calling the function with 'print' to make sure the results are displayed
print(cumulative_sum(arr))