【问题标题】:Finding the sum of first two elements in a list and the second two elements and so on?查找列表中前两个元素和后两个元素的总和,依此类推?
【发布时间】:2018-03-30 15:50:26
【问题描述】:

y 是列表的列表,并且 Total 是一个空列表

u = [ y[i][::2] for i in range(x) ]
t = [ y[i][1::2] for i in range(x) ]
for a in range(x):
    for i in range(7):
        Total.append(u[a][i]+t[a][i])

例如

y = [[1,3,6,9,2,1],[3,8,1,5,6,2]]  
u=[[3,9,1],[8,5,2]]  
t=[[1,6,2],[3,1,6]]  
Total = [[4,15,3],[11,6,8]] 

有没有更简单的方法以更 Pythonic 的方式编写此代码,或者是最简单的方法?

【问题讨论】:

  • 我什至不明白你的意思。能否提供一些示例数据和结果?
  • x 来自哪里?
  • 看来x是y[0]的长度
  • 请阅读如何提供minimal reproducible example。特别是,您的问题缺少输入和所需输出的示例,如果您不更新它可能很快就会关闭。
  • 肯定有更简单的方法:)

标签: python arrays python-3.x list


【解决方案1】:

如果你的数组长度相同,那么你可以使用这个:

设 u 和 t 为列表

a=[]
for i in u:
    a.append(u[i]+t[i])

【讨论】:

  • 我不知道谁赞成这个,但真的看看它。 错了。
【解决方案2】:

您发布的语法在多个语法和语义方面都失败了。 简化成这样?

>>> [[y[i][j] + y[i][j+1]    // sum of each even index with the next one
            for j in range(0, len(y[i]), 2) ] 
        for i in range(len(y)) ] 
[[4, 15, 3], [11, 6, 8]]

【讨论】:

  • @Prune,range(0, len(y[i]), 2),我不知道range()可以这么容易地设置step=2。
  • @Gomulka:我编辑了我的答案来处理你的澄清。这显然是在我发布前几秒钟出现的,当我点击“发布”按钮时我还没有看到它。
  • @Sphinx:我很高兴能在这一天提供帮助。据我所知,任何第三代或更高版本的语言都可以指定其基本迭代循环的步长。这可以追溯到 1950 年代后期的 FORTRAN 和 Algol。
【解决方案3】:

我可能会使用嵌套列表推导。

y = [[1,3,6,9,2,1],[3,8,1,5,6,2]]

Total = [[i+j
          for i,j in zip(sublist[0::2], sublist[1::2])]
         for sublist in y]

assert Total == [[4,15,3],[11,6,8]]
  • for sublist in y - 对于原始列表中的每个子列表,求和运算必须独立进行。
  • sublist[0::2] - 所有偶数索引值。
  • sublist[1::2] - 所有奇数索引值。
  • zip(sublist[0::2], sublist[1::2]) - 一个带有 (first, second) 的元组,然后是一个带有 (third,fourth) 的元组,等等。
  • i+j for i,j in zip(...) - 将每一对相加。

【讨论】:

    【解决方案4】:

    我建议您为此使用numpy。

    import numpy as np
    
    y = [[1,3,6,9,2,1],[3,8,1,5,6,2]]
    
    A = np.array(y)
    res = A[:, ::2] + A[:, 1::2]
    
    # [[ 4 15  3]
    #  [11  6  8]]
    

    【讨论】:

      【解决方案5】:

      刚刚看到您提供了示例数据,所以更新y。然后我提供一种方法来产生与您相同的结果。

      您不需要循环两次来获取奇数/偶数元素的子列表,然后对每个元素求和。

      只需简单地循环 y[index] 和 range(half of len(y[index]),然后是 sum([row[index*2], row[index*2+1]])。

      total = []
      y = [[1,3,6,9,2,1],[3,8,1,5,6,2]]
      x = len(y)
      
      u = [ y[i][::2] for i in range(x) ]
      t = [ y[i][1::2] for i in range(x) ]
      for a in range(x):
          for i in range(3):
              total.append(u[a][i]+t[a][i])
      #the result of your method
      print('yours', total)
      
      #below is mine:
      result = list(map(lambda row: [sum([row[index], row[index+1]]) for index in range(0, len(row), 2)] , y))
      print('mine',result)
      print('mine', result[0]+result[1])
      

      输出:

      yours [4, 15, 3, 11, 6, 8]
      mine [[4, 15, 3], [11, 6, 8]]
      mine [4, 15, 3, 11, 6, 8]
      [Finished in 0.163s]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 2018-11-13
        相关资源
        最近更新 更多