【问题标题】:Sort & count list of 3-element tuples by second and third value of a tuple按元组的第二个和第三个值对三元素元组的列表进行排序和计数
【发布时间】:2020-01-22 14:05:01
【问题描述】:

我有这样的元组列表

l =[(1, 'project1', 'errorMessage1'), 
    (2, 'project1', 'errorMessage1'), 
    (3, 'project2', 'errorMessage1'),
    (1, 'project3', 'errorMessage2')]

我希望第一列包含具有不同项目和错误消息的所有值的总和,如下所示:

[(3, 'project1', 'errorMessage1'),
 (3, 'project2', 'errorMessage1'),
 (1, 'project3', 'errorMessage3')]

我尝试了 Counter 和其他一些东西,但不知道我应该如何处理这个问题。

【问题讨论】:

    标签: python python-3.x list sum tuples


    【解决方案1】:

    您可以使用字典来保存计数的总和来解决这个问题:

    l =[(1, 'project1', 'errorMessage1'), 
        (2, 'project1', 'errorMessage1'), 
        (3, 'project2', 'errorMessage1'),
        (1, 'project3', 'errorMessage2')]
    
    d = {}
    
    for t in l:
        if t[1:] in d:
            d[t[1:]] += t[0]
        else:
            d[t[1:]] = t[0]
    

    输出:

    >>> d
    {('project1', 'errorMessage1'): 3,
     ('project2', 'errorMessage1'): 3,
     ('project3', 'errorMessage2'): 1}
    

    添加列表推导以重新格式化结果:

    >>> [(v, *k) for k, v in d.items()]
    [(3, 'project1', 'errorMessage1'),
     (3, 'project2', 'errorMessage1'),
     (1, 'project3', 'errorMessage2')]
    

    【讨论】:

      【解决方案2】:

      假设您想对元组的第 0 个元素求和,如果您不想使用 dict,也可以使用 itertools.groupbysum 来实现,如下所示:

      from itertools import groupby
      from operator import itemgetter
      
      input = [
          (1, 'project1', 'errorMessage1'),
          (2, 'project1', 'errorMessage1'),
          (3, 'project2', 'errorMessage1'),
          (1, 'project3', 'errorMessage2'),
      ]
      
      def sum_by_project_and_error(input):
          # groupby needs the iterable to be sorted by the elements we want to group by.
          # We sort by project and error message (the 1st and 2nd element of the tuples) using itemgetter. 
          key_function = itemgetter(1, 2)
          sorted_input = sorted(input, key=key_function)
          grouped_input = groupby(sorted_input, key=key_function)
      
          for (project, error), group in grouped_input:
              yield sum(count for count, _, _ in group), project, error
      
      
      output = list(sum_by_project_and_error(input))
      
      

      【讨论】:

      • 这种方法比使用字典有什么优势?
      猜你喜欢
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多