【问题标题】:Sum of duplicate values in 2d array二维数组中重复值的总和
【发布时间】:2021-04-04 19:42:41
【问题描述】:

所以,我敢肯定以前有人问过类似的问题,但我找不到我需要的东西。

我有一个输出二维数组的程序,如下所示:

arr = [[0.2, 3], [0.3, "End"], ...]

可能有更多或更少的元素,但每个都是一个 2 元素数组,其中第一个值是浮点数,第二个值可以是浮点数或字符串。

这两个值都可能重复。在每个数组中,第二个元素只取几个可能的值。

我想要做的是将数组中第一个元素的值与第二个元素具有相同值的值相加,并输出一个没有这些重复值的类似数组。

例如:

input = [[0.4, 1.5], [0.1, 1.5], [0.8, "End"], [0.05, "End"], [0.2, 3.5], [0.2, 3.5]] 

output = [[0.5, 1.5], [0.4, 3.5], [0.85, "End"]] 

如果输出数组按第二个元素排序(浮点数升序,字符串在末尾),我将不胜感激,尽管这不是必需的。

编辑:感谢您的两个答案;我决定使用 Chris 的那个,因为代码对我来说更容易理解,尽管 groupby 似乎是一个旨在解决这个问题的函数,所以我也会尝试阅读它。

更新:根据手头任务的性质,浮点数的值始终为正,因此我使用负值来停止使用任何字符串 - 现在我有一些 if 语句来检查那些“编码”负值并在它们被打印出来之前再次用字符串替换它们,因此现在排序更容易了。

【问题讨论】:

    标签: python arrays multidimensional-array


    【解决方案1】:

    您可以使用字典来累积列表中由第二个项目键入的第一个值的总和。

    要获取列表末尾的“字符串”项,可以在排序键中将排序键设置为正无穷大float('inf')

    input_ = [[0.4, 1.5], [0.1, 1.5], [0.8, "End"], [0.05, "End"], [0.2, 3.5], [0.2, 3.5]]
    
    d = dict()
    
    for pair in input_:
        d[pair[1]] = d.get(pair[1], 0) + pair[0]
    
    L = []
    for k, v in d.items():
        L.append([v,k])
    
    L.sort(key=lambda x: x[1] if type(x[1]) == float else float('inf'))
    
    print(L)
    

    打印出来:

    [[0.5, 1.5], [0.4, 3.5], [0.8500000000000001, 'End']]
    

    【讨论】:

      【解决方案2】:

      你可以试试itertools.groupby

      import itertools
      out = [[key, sum([elt[0]for elt in val])] for key, val in itertools.groupby(a, key=lambda elt: elt[1])]
      >>> [[0.5, 1.5], [0.8500000000000001, 'End'], [0.4, 3.5]]
      

      说明

      1. 使用itertools.groupbykey 参数根据每个子列表的第二个元素对二维列表进行分组。我们在第二个元素上将 lambda key=lambda elt: elt[1] 定义为 groupby:
      for key, val in itertools.groupby(a, key=lambda elt: elt[1]):
          print(key, val)
      # 1.5 <itertools._grouper object at 0x0000026AD1F6E160>
      # End <itertools._grouper object at 0x0000026AD2104EF0>
      # 3.5 <itertools._grouper object at 0x0000026AD1F6E160>
      
      1. 对于组的每个值,使用内置函数 sum 计算 sum
      for key, val in itertools.groupby(a, key=lambda elt: elt[1]):
          print(sum([elt[0]for elt in val]))
      # 0.5
      # 0.8500000000000001
      # 0.4
      
      1. 计算所需的输出:
      out = []
      for key, val in itertools.groupby(a, key=lambda elt: elt[1]):
          out.append([sum([elt[0]for elt in val]), key])
      print(out)
      # [[0.5, 1.5], [0.8500000000000001, 'End'], [0.4, 3.5]]
      
      

      然后你说第二个值排序但是有stringsnumbers,这对计算机来说是一个相当大的问题。它无法在数字和字符串之间做出选择。对象必须具有可比性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 2022-12-31
        • 2012-05-08
        • 1970-01-01
        • 2015-12-13
        • 2016-01-28
        相关资源
        最近更新 更多