【问题标题】:How to find the sum of values with the same variable in 2d list python, with using only list comprehension?如何在 2d 列表 python 中找到具有相同变量的值的总和,仅使用列表理解?
【发布时间】:2020-12-02 13:47:46
【问题描述】:

假设我有一个列表列表:

list_of_lists = [['5464', 49.96], ['5464', 99.91], ['5464', 99.91], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 274.89], ['88112', 199.75], ['9744', 404.55], ['9744', 404.55]]

我应该如何使用列表推导来找到每个变量的总和?

E.g. sum_of_lists = [['5464', 249.78],['7733',208.89],['8274',233.82],['8732',93.93],['88112',474.64],['9744', 809.1]]

【问题讨论】:

    标签: python multidimensional-array list-comprehension


    【解决方案1】:

    您可以使用itertools.groupby 按第一个元素收集子列表。然后sum每组子列表的第二个元素。

    >>> from itertools import groupby
    >>> [[k, sum(i[1] for i in g)] for k, g in groupby(list_of_lists, key=lambda i: i[0])]
    [['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]
    

    请注意,groupby 假定组已经排序/连续,因此如果还不是这种情况,您需要先使用相同的key 对您的列表进行sort

    【讨论】:

      【解决方案2】:

      如果输入按第一个元素排序,您可以使用itertools.groupby

      from itertools import groupby
      from operator import itemgetter
      
      list_of_lists = [['5464', 49.96], ['5464', 99.91], ['5464', 99.91], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93],
                       ['88112', 274.89], ['88112', 199.75], ['9744', 404.55], ['9744', 404.55]]
      
      res = [[key, sum(v for _, v in group)] for key, group in groupby(list_of_lists, key=itemgetter(0))]
      print(res)
      

      输出

      [['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]
      

      作为替代方案,对于一般输入,您可以使用以下方法:

      od = OrderedDict()
      for key, value in list_of_lists:
          if key in od:
              od[key] = od[key] + value
          else:
              od[key] = value
      
      res = list(od.items())
      print(res)
      

      输出

      [('5464', 249.78), ('7733', 208.89), ('8274', 233.82), ('8732', 93.93), ('88112', 474.64), ('9744', 809.1)]
      

      请注意,对于 Python 3.6+,您可以使用常规 dict,而不是 OrderedDict

      最后这两种方法是O(n),线性时间,并且对于更大的输入会更好地扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        相关资源
        最近更新 更多