Python 复列表与len计算

Python 复列表与len计算,python,Python,以下代码的输出为[1、3、6、10]。我知道如何得到1和3,但不是6和10。 在第一个循环中,第一个列表项1等于[my\u list[0]],3等于[out\u list[len(out\u list)-1]+my\u list[i] 在第二个循环中,out\u list=4+[1+3]=8不是6 def mystery(my_list): out_list = [my_list[0]] for i in range(1, len(my_list)): ou

以下代码的输出为
[1、3、6、10]
。我知道如何得到1和3,但不是6和10。 在第一个循环中,第一个列表项1等于
[my\u list[0]]
,3等于
[out\u list[len(out\u list)-1]+my\u list[i]
在第二个循环中,
out\u list=4+[1+3]=8
不是6

def mystery(my_list): 
    out_list = [my_list[0]] 
    for i in range(1, len(my_list)): 
        out_list += [out_list[len(out_list)-1] + my_list[i]] 
    print(out_list)

mystery([1, 2, 3, 4]) #output[1, 3, 6, 10]

我非常接近理解它,只是需要多一点解释。我说得对吗?第一个循环,out_list=1,[out_list[len(out_list)-1]=1,my_list[i]=2,因此,[1,3]。第二圈,名单保持不变,然后我被困在这里

  • out\u list[len(out\u list)-1]
    只是out\u list中的最后一项,与
    out\u list[-1]
    相同
  • 将项目添加到列表中的操作不明显。执行
    lst+=[smtn]
    与执行
    lst.append(smtn)
  • 这会使函数更易于阅读吗

    def mystery(my_list): 
        out_list = [my_list[0]] 
        for i in range(1, len(my_list)): 
            out_list.append(out_list[-1] + my_list[i])
        print(out_list)
    
    此代码返回一个列表,其i的项是输入的前i项之和。在i迭代中,取i-1项的总和(存储在i-1中),并从列表中添加第i项。3=1+2, 6=(1+2)+3, 10=(1+2+3)+4. 如果my_列表中的下一项是5,则out_列表中的下一项将是10+5=15

    编辑: 为了进一步澄清,让我们分阶段进行

    • my_list=[1,2,3,4]
      然后输入方法
    • 输入时,我们有
      out\u list=[my\u list[0]]
      。所以现在
      out\u list=[1]
    • 现在我们进入循环:
      • 第一次迭代,i=1<代码>输出列表[len(输出列表)-1]+我的列表[i]=
        输出列表[0]+我的列表[1]
        =
        1+2
        =
        3
        <代码>输出列表=[1,3]
      • 第二次迭代,i=2<代码>输出列表[len(输出列表)-1]+我的列表[i]=
        输出列表[1]+我的列表[2]
        =
        3+3
        =
        6.
        输出列表=[1,3,6]
      • 第三次迭代,i=3<代码>输出列表[len(输出列表)-1]+我的列表[i]=
        输出列表[2]+我的列表[3]
        =
        6+4
        =
        10.
        输出列表=[1,3,6,10]

    一种非常容易做到这一点的pythonic方法:

    def summer_foo(my_list):
        return [sum(my_list[:i+1]) for i in range(len(my_list))]
    
    简要说明

  • 从0循环到列表的len-
    len(我的列表)
  • 对从0到
    i的所有元素求和
  • 将此元素放入列表中(这是通过理解完成的)
  • 如果
    i
    等于0,则将获得第一个元素

    如果
    i
    等于1,您将得到第一个和第二个元素的总和(
    i
    属于[0,2])


    等等…

    我的列表最初是:[1,2,3,4]
    output = mystery([1, 2, 3, 4]) # [1, 3, 6, 10]
    output == [1, 1+2, 1+2+3, 1+2+3+4]
    
    出局名单最初是:[1]

    每个iter上1次迭代中的out_列表大纲:[1] 我来了:1 len(外名单):1我的名单[i]:2 使用此语句添加下一个元素:out_list+=[out_list[len(out_list)-1]+my_list[i]] 检查此处:签出列表[0]给出1将此添加到2

    每个iter上的2个迭代大纲中的out_列表:[1,3] 我来了:2 len(名单外):2我的名单[i]:3 使用此语句添加下一个元素:out_list+=[out_list[len(out_list)-1]+my_list[i]] 检查这里:out_list[1]给出了3将此添加到3

    每个国际热核实验堆的3个迭代大纲中的out_列表:[1,3,6] 我来了:3 len(名单外):3我的名单[i]:4 使用此语句添加下一个元素:out_list+=[out_list[len(out_list)-1]+my_list[i]] 检查这里:out_list[2]给出了6,将其添加到4

    最后输出为:[1,3,6,10]


    out_list+=[out_list[len(out_list)-1]+my_list[i]]此语句将上一个元素附加到out_list中,即为什么使用out_list+=而不是out_list=因此,只有在第三次和第四次迭代中,当您说4+[1+3]时,第三次循环的结果是6和10

    你从哪里得到4,1,3呢?1=1,3=1+2,6=3+3,10=6+4。实际上,
    out\u列表[i]=out\u列表[i-1]+my\u列表[i]
    out\u列表中的每个元素都是它在
    out\u列表
    my\u列表[i]
    中的前一个元素的总和。第一个循环:out\u列表(=4)=out\u列表(=1)[out\u列表”+my\u[i] 在第一个循环中,它是1(out_list)+(1+2)=4。在第二个循环中,它是4+[1+3]=8,依此类推?在第一个循环中,它是1(out_list)+(1+2)=4。在第二个循环中,它是4+[1+3]=8,依此类推?第一个循环[1]+[3]。第二个循环[1]+[3]+[[out_list[len len(out_list)-1]+3],就是[[out_list]1]=3?@dfefeff我在我的答案中添加了一个逐步的澄清。在第一个循环中,它是1(out_list)+(1+2)=4。在第二个循环中,4+[1+3]=8,依此类推?将两个列表相加并不能求和。它将它们串联起来。因此代码实际上是将数字转换成一个列表。它看起来像
    [1]+[3]
    ,变成
    [1,3]
    。然后
    [1,3]+[6]
    这是
    [1,3,6]
    第一个循环,[1]+[3]。第二个循环,[1]+[3]+[[out\u list[len(out\u list)-1]+3],那是[[out\u list[len(out\u list)-1]=3?我认为当你对你的意图进行解释时,这对OP和其他访客会更有帮助。我很接近理解它,只是需要更多的解释。对吗?第一个循环,out_list=1,[out_list[len(out_list)-1]=1,my_list[I]=2,因此,[1,3].2nd循环,out_list保持不变,然后我被困在这里…在1st循环中,它是1(out_list)+(1+2)=4。在2nd循环中,4+[1+3]=8,依此类推?请注意,这是n^2,而不是原始的线性时间,因为我们正在重新计算每个元素的和,而不是重复使用前面所有元素的和。@dfefeff:上面的过程将告诉您如何在第三次迭代中得到6,在第四次迭代中得到10……因为out\u list是在eac中添加元素的列表h迭代。