Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表中找到元素的连续序列之和?_Python_List - Fatal编程技术网

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

Python 如何在列表中找到元素的连续序列之和?,python,list,Python,List,我需要编写一个函数,给定一个整数列表L,如果该列表包含一个和为n的连续值序列,则返回True,否则返回False 假设我的列表是:L=[2,2,4,4,0,0,2,8]和n=3。 函数应该返回False,因为没有连续的值总和为3 要求:不允许使用Python的模块 我试过: def consecutive(L,n): for i in range(len(L)): for j in range(i+1, len(L)): if sum(L[i:j+

我需要编写一个函数,给定一个整数列表L,如果该列表包含一个和为n的连续值序列,则返回True,否则返回False

假设我的列表是:L=[2,2,4,4,0,0,2,8]和n=3。 函数应该返回False,因为没有连续的值总和为3

要求:不允许使用Python的模块

我试过:

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)

这部分是有效的,因为当我设置n=12时,它返回True。我知道切片有一些问题需要解决,但我不知道它是什么

最简单的方法是通过每个起始点循环每个索引和每个窗口大小,从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]将是相同的。主要问题很简单:在这种情况下,范围必须为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)

你为什么说这只是部分起作用?在我看来,你这里有一个解决办法。而且,我不清楚你的问题。您想从我们这里得到什么信息?您保证列表值有任何信息吗?特别是,是否会有负值?输出的功能只是部分正确,例如n=3,n=10。假设n=12,输出应该为False,但我的函数输出的是True。我想知道出了什么问题。前几个元素加起来是12:2+2+4+4,再加上一两个0。