如何找到列表中元素的连续序列之和?

时间:2019-05-14 22:16:24

标签: python list

我需要编写一个给定整数列表L的函数,如果该列表包含一个总和为True和{{1 }}。

比方说我的名单是:nFalse = 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) 。我知道切片可以解决某些问题,但我无法弄清它是什么。

2 个答案:

答案 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)