【问题标题】:Sum of consecutive pairs in a list including a sum of the last element with the first列表中连续对的总和,包括最后一个元素与第一个元素的总和
【发布时间】:2020-11-22 13:02:17
【问题描述】:

我有一个像[1,3,5,6,8,7] 这样的元素列表。 我想要一个列表中两个连续元素之和的列表,最后一个元素也与列表的第一个元素相加。 我的意思是在上述情况下,我想要这个列表: [4,8,11,14,15,8]

但是在for循环中添加最后一个元素和第一个元素时,会出现索引超出范围。 考虑以下代码:

List1 = [1,3,5,6,8,7]
List2 = [List1[i] + List1[i+1] for i in range (len(List1))]

print(List2)

【问题讨论】:

  • 您希望列表中的最后一个8 是预期结果吗?
  • 不应该使用 len -1 或 % len 吗?
  • @Ederic Oytas,是的,它是最后一个元素和第一个元素的总和,反之亦然。
  • i+1 更改为(i+1) % len(List1)
  • @AdnanAkram - 关于 len - 1,你是对的,但模数应该会产生预期的结果(请看上面的 Steven Rumbalski 评论)

标签: python list for-loop


【解决方案1】:
List2 = [List1[i] + List1[(i+1)%len(List1)] for i in range (len(List1))]

【讨论】:

  • 我喜欢它,虽然它有点低效,因为模运算符实际上只对最后一个元素有用。
【解决方案2】:
[List1[i] + List1[(i+1) % len(List1)] for i in range(len(List1))]

[sum(tup) for tup in zip(List1, List1[1:] + [List1[0]])]

[x + y for x, y in zip(List1, List1[1:] + [List1[0]])]  

【讨论】:

    【解决方案3】:

    因为i+1,索引超出范围

    List1 = [1,3,5,6,8,7]
    List2 = [List1[i-1] + List1[i] for i in range (len(List1))]
    
    print (List2)
    

    这种方法有点用
    结果:

    [8, 4, 8, 11, 14, 15]
    

    【讨论】:

    • 它错过了最后一个整数 (8)
    • 不,第一个元素是最后一个整数。
    【解决方案4】:

    这会旋转列表

    In [9]: List1[1:] + List1[:1]                                                                 
    Out[9]: [3, 5, 6, 8, 7, 1]
    

    所以以下工作完美

    In [8]: [x + y for x, y in zip(List1, List1[1:] + List1[:1])]                                 
    Out[8]: [4, 8, 11, 14, 15, 8]
    

    【讨论】:

      【解决方案5】:

      您实际上在做的是在列表中添加连续的项目,但是当您到达最后一个索引时,您的代码仍然会在最后一个索引上添加一个,这会导致索引超出范围错误。您应该考虑使用:

      List1 = [1,3,5,6,8,7]
      List2 = [List1[i] + List1[i+1] for i in range (len(List1) - 1)]
      List2.append(List1[0] + List1[-1])
      
      print (List2)
      

      【讨论】:

      • 不知道你为什么失望,你的答案是产生所要求结果的两个之一
      【解决方案6】:

      当你将它运行到 len(List1) - 1 因此,当 i 值为 len(List1) - 1 时,i + 1 将超出范围(即 len(List1)), 所以你可以试试这个解决方案:

      List2 = [List1[i-1] + List1[i] for i in range (len(List1))]
      

      或者你可以这样做:

      List2 = [List1[i] + List1[i+1] for i in range (len(List1)-1)]
      

      或者您也可以使用任何其他逻辑。 干杯!

      【讨论】:

        【解决方案7】:

        这是另一个丑陋的解决方案:

        List1 = [1,3,5,6,8,7] 
        List2 = [List1[i] + (List1+[List1[0]])[i+1] for i in range (len(List1))]
        
        print (List2)
        

        【讨论】:

          【解决方案8】:

          还有一些尚未回答的 Pythonic 答案:

          使用map 可以更具可读性:

          List2 = list(map(sum, zip(List1, List1[1:] + List1[:1])))
          

          你也可以使用itertools来偏移列表:

          import itertools
          List2 = list(map(sum, zip(List1, itertools.islice(itertools.cycle(List1), 1, None))))
          

          【讨论】:

            【解决方案9】:

            i == 5时,则进入“if”语句,i设置为-1。 注意List[-1]List[len(List) - 1]是一样的,也就是说List[i+1]会变成List[0],列表的第一个元素。

            for i in range(len(List1)):
                if i == len(List1) - 1:
                    i = -1
                List2.append(List1[i] + List1[i+1])
            

            【讨论】:

            • 欢迎来到 Stack Overflow。在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码如何回答问题,以便它不仅对 OP 有用,而且对遇到相同问题的其他用户也有用。
            猜你喜欢
            • 2022-10-21
            • 1970-01-01
            • 2018-05-30
            • 1970-01-01
            • 2019-01-28
            • 2022-12-13
            • 2011-05-28
            • 1970-01-01
            • 2018-01-09
            相关资源
            最近更新 更多