Сортировка и подсчет списка трехэлементных кортежей по второму и третьему значению кортежа - PullRequest
0 голосов
/ 22 января 2020

У меня есть такой список кортежей

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

Я бы хотел, чтобы в первом столбце содержалась сумма всех значений с отдельным проектом и errorMessage, например:

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

I пробовал Counter, и некоторые другие вещи, но не вижу, как я должен подходить к этому.

Ответы [ 2 ]

4 голосов
/ 22 января 2020

Вы можете решить эту проблему, используя словарь для хранения суммы отсчетов:

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')]
1 голос
/ 22 января 2020

Предполагая, что вы хотите суммировать 0-е элементы кортежей, если вы не хотите использовать дикт, вы можете также добиться этого, используя itertools.groupby и sum вот так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...