我必须找到第一个索引,其中直到该索引的元素总和(本身不包括)大于元素本身。如果没有这样的元素只返回-1。 我的代码:
def bigger_sum(numbers):
tmp_var = 0
for i in range(len(numbers)):
tmp_var += numbers[i]
if tmp_var > numbers[i]:
return i
return -1
[1, 2, 3, 4] => 3
[1, 2, 3] => -1
[1, 2] => -1
我只在最后两个列表-1
上得到了正确的输出,但如果我尝试第一个列表,则输出为空。代码有什么问题?
答案 0 :(得分:2)
首先,只有在遍历整个列表而不是针对每个索引进行迭代时,才能减少return -1
的缩进级别。
如果您这样做,您的代码将如下所示:
def bigger_sum(numbers):
tmp_var = 0
for i in range(len(numbers)):
tmp_var += numbers[i]
if tmp_var > numbers[i]:
return i
return -1
您的代码现在将为所有测试用例返回1
,因为if条件在循环的第二次迭代中始终为true。 你能明白为什么吗?
要解决此问题过早增加temp_value
,请将tmp_var += numbers[i]
行移至for循环块的底部:
def bigger_sum(numbers):
tmp_var = 0
for i in range(len(numbers)):
if tmp_var > numbers[i]:
return i
tmp_var += numbers[i]
return -1
print(bigger_sum([1, 2, 3, 4])) # 3
print(bigger_sum([1, 2, 3])) # -1
print(bigger_sum([1, 2])) # -1
答案 1 :(得分:2)
您违反了自己未包含的""在检查tmp_var
之前添加到tmp_var > numbers[i]
的规则。
此外,您-1
时第一次从函数返回tmp_var <= numbers[i]
。你需要在循环后返回语句。
def bigger_sum(numbers):
tmp_var = 0
for i, item in enumerate(numbers):
if tmp_var > item:
return i
tmp_var += item
return -1
print(bigger_sum([1, 2, 3, 4])) # 3
print(bigger_sum([1, 2, 3])) # -1
print(bigger_sum([1, 2])) # -1
我允许自己使用enumerate
增强您的代码,因为range(len(numbers))
是一种暴行。
答案 2 :(得分:1)
根据描述你需要考虑直到该指数的元素总和(本身不包括在内),这意味着你不应该在总和中包含当前指数的值以前的元素。
以下是如何更改代码:
def bigger_sum(numbers):
tmp_var = 0
for i in range(len(numbers)-1):
tmp_var += numbers[i]
# Compare the sum of elements
# up to this index, to the next index
if tmp_var > numbers[i+1]:
return i+1
return -1
答案 3 :(得分:1)
您的代码存在两个问题:
return -1
行应该在循环外发生。这可能只是你的错字。您可以完全删除循环并使用itertools.accumulate
编写单行来生成运行总和:
from itertools import accumulate next((i for i, (n, s) in enumerate(zip(numbers, accumulate(numbers))) if 2 * n < s), -1)
我在这里使用2 * n
因为正在运行的总和s
包含当前元素n
。测试n < s - n
与测试2 * n < s
相同。
-1
的返回值由next
的默认参数提供。