簡體   English   中英

按元組的第二個和第三個值對三元素元組列表進行排序和計數

[英]Sort & count list of 3-element tuples by second and third value of a tuple

我有這樣的元組列表

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

我希望第一列包含具有不同項目和錯誤消息的所有值的總和,如下所示:

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

我嘗試了 Counter 和其他一些東西,但不知道我應該如何解決這個問題。

您可以使用字典來保存計數總和來解決這個問題:

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')]

假設你想對元組的第 0 個元素求和,如果你不想使用字典,你也可以使用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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM