我需要编写一个给定整数列表L
的函数,如果该列表包含一个总和为True
和{{1 }}。
比方说我的名单是:n
和False
= 3。
该函数应返回L = [2,2,4,4,0,0,2,8]
,因为没有连续的值总计为3。
要求:不允许使用Python模块
我尝试过:
n
这部分起作用,因为当我设置False
时,它返回def consecutive(L,n):
for i in range(len(L)):
for j in range(i+1, len(L)):
if sum(L[i:j+1])==n:
return True
return False
L = [2,2,4,4,0,0,2,8]
consecutive(L,3)
。我知道切片可以解决某些问题,但我无法弄清它是什么。
答案 0 :(得分:0)
天真的方法是遍历每个潜在的起始点(每个索引)和每个窗口大小(从0到列表长度的任何数字):
def consecutive(L, n):
for i in range(len(L)):
for window_size in range(len(L)):
if sum(L[i:i + window_size]) == n:
return True
else:
return False
请注意,从不对同一个窗口进行多次检查(例如,如果列表的长度为3,则L[2:4]
和L[2:3]
就是同一件事),可以很容易地对此进行改进。 / p>
答案 1 :(得分:0)
主要问题很简单:在这种情况下,范围必须为len + 1 ,否则在边缘情况下将失败。工作代码为:
def consecutive(L, n):
for i in range(len(L)+1):
for j in range(i+1,len(L)+1):
s=sum(L[i:j])
if s == n:
print(i,j,s,'TRUE') #DEBUG: remove when done
#return True #uncomment this to reintegrate
else: print(i,j,s) #DEBUG: remove when done
return False
L = [2,2,4,4,0,0,2,-3]
consecutive(L,3)
更好的是,在您的示例中,您没有显示负数。如果您没有否定词,则可以通过在循环超出搜索值n时跳过循环来提高代码的效率:
def consecutive(L, n):
for i in range(len(L)+1):
for j in range(i+1,len(L)+1):
s=sum(L[i:j])
if s == n:
print(i,j,s,'TRUE') #DEBUG: remove when done
#return True #uncomment
elif s > n:
print(i,j,s,'too big') #DEBUG: remove when done
break
else: print(i,j,s) #DEBUG: remove when done
return False
L = [2,2,4,4,0,0,2,1]
consecutive(L,3)