【问题标题】:Sum columns of parts of 2D array Python对二维数组 Python 各部分的列求和
【发布时间】:2017-11-19 17:24:30
【问题描述】:

如果前两列匹配,你如何取最后两列的总和?

输入:

 M =   [[1,1,3,5],
        [1,1,4,6],
        [1,2,3,7],
        [1,2,6,6],
        [2,1,0,8],
        [2,1,3,5],
        [2,2,9,6],
        [2,2,3,4]]

输出:

M = [[1,1,7,11],
    [1,2,9,13],
    [2,1,3,13],
    [2,2,12,10]]

你能用 for 循环来做吗?

【问题讨论】:

  • 我认为您的输入数据有误。我认为 M[0][1]M[1][1] 都应该是 1 而不是 2。也就是说,如果我理解你想要做什么的话。
  • 它们是否总是正确排序?或者M[0]M[-1]可以切换吗?
  • 那是正确的(FamousJameous),我的错,对不起..

标签: python arrays matrix sum calculated-columns


【解决方案1】:

假设 2 个相似的列表始终相互跟随,您可以遍历 M[:-1],然后根据下一个列表值检查当前列表值

M =[[1,1,3,5],[1,1,4,6],[1,2,3,7],[1,2,6,6],[2,1,0,8],[2,1,3,5],[2,2,9,6],[2,2,3,4]]
t=[]
for i,m in enumerate(M[:-1]):
  if m[0] == M[i+1][0] and m[1]==M[i+1][1]:
    t.append([m[0],m[1],m[2]+M[i+1][2],m[3]+M[i+1][3]])
print(t)
#[[1, 1, 7, 11], [1, 2, 9, 13], [2, 1, 3, 13], [2, 2, 12, 10]]

如果订单可能被打乱,我会使用 2 个for 循环。第二个将检查m 与它之后的所有其他列表(它不需要检查那些之前的列表,因为它们已经检查了它)。

for i,m in enumerate(M[:-1]):
  for x,n in enumerate(M[i+1:]):
    if m[0] == n[0] and m[1]==n[1]:
      t.append([m[0],m[1],m[2]+n[2],m[3]+n[3]])

【讨论】:

    【解决方案2】:

    我们可以在前两列中找到唯一的元组,然后遍历它们以找到行等于该元组的每一列的总和。

    不确定最快的解决方案是什么,但这是一种选择:

    M =[[1,1,3,5],[1,1,4,6],[1,2,3,7],[1,2,6,6],[2,1,0,8],[2,1,3,5],[2,2,9,6],[2,2,3,4]]
    
    ans = []
    for vals in list(set((x[0], x[1]) for x in M)):
        ans.append([vals[0], vals[1], sum(res[2] for res in M if (res[0], res[1]) == vals), sum(res[3] for res in M if (res[0], res[1]) == vals)])
    

    【讨论】:

      【解决方案3】:

      具有列表理解和itertools'groupby的解决方案:

      from itertools import groupby
      
      M = [
          [1,1,3,5],
          [1,1,4,6],
          [1,2,3,7],
          [1,2,6,6],
          [2,1,0,8],
          [2,1,3,5],
          [2,2,9,6],
          [2,2,3,4],
      ]
      
      print([
          [
              key[0],
              key[1],
              sum(x[2] for x in group),
              sum(x[3] for x in group),
          ]
          for key, group in [
              (key, list(group))
              for key, group in groupby(sorted(M), lambda x: (x[0], x[1]))
          ]
      ])
      

      结果:

      [[1, 1, 7, 11], [1, 2, 9, 13], [2, 1, 3, 13], [2, 2, 12, 10]]
      

      reduce 可以简化为:

      from itertools import groupby
      from functools import reduce
      
      M = [
          [1,1,3,5],
          [1,1,4,6],
          [1,2,3,7],
          [1,2,6,6],
          [2,1,0,8],
          [2,1,3,5],
          [2,2,9,6],
          [2,2,3,4],
      ]
      
      print([
          reduce(
              lambda x, y: [y[0], y[1], y[2] + x[2], y[3] + x[3]],
              group,
              (0, 0, 0, 0),
          )
          for _, group in groupby(sorted(M), lambda x: (x[0], x[1]))
      ])
      

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2013-04-10
        相关资源
        最近更新 更多