Суммируйте значения на основе одинаковых ключей в dict и создайте массив

Здравствуйте ребята, у меня есть такие данные

[
{
    'name': 'snow 7', 
    'count': 1, 
    'rows_processed': None, 
    'pipelines': 1
}, 
{
    'name': 'snow 6',
    'count': 1,
    'rows_processed': None,
    'pipelines': 1
},
{
    'name': 'snow 6',
    'count': 1,
    'rows_processed': None,
    'pipelines': 1
}, 
{
    'name': 'snow 6',
    'count': 2,
    'rows_processed': None,
    'pipelines': 2
},
{
    'name': 'snow 5',
    'count': 2,
    'rows_processed': 4,
    'pipelines': 2
},
{
    'name': 'snow 4',
    'count': 2,
    'rows_processed': None,
    'pipelines': 2
}]

и я хочу суммировать значения rows_processed и pipelines на основе ключа name, например, для snow 6 pipelines сумма будет равна 4 и так далее, в основном конечные данные должны выглядеть следующим образом.

    {
     "Rows Processed": [0, 0, 4, 0],
     "Pipelines Processed": [1, 4, 2, 2]
    }

как я могу сделать данные, как описано выше? вот что я сделал для этого

    rows_processed = {}
    pipeline_processed = {}
    for batch in batches:
        for label in batch.keys():
            rows_processed[label] = rows_processed.get(batch['rows_processed'], 0) + batch['rows_processed'] if batch['rows_processed'] else 0
    for batch in batches:
        for label in batch.keys():
            pipeline_processed[label] = pipeline_processed.get(batch['pipelines'], 0) + batch['pipelines'] if \
            batch['pipelines'] else 0

Привет, ребята, я решил вышеуказанный вопрос, выполнив следующий код, однако я не уверен, правильный ли это подход или нет. Если у кого-то есть лучший подход, пожалуйста, дайте мне знать.

    rows_processed = {}
    pipeline_processed = {}
    for batch in batches:
        rows_processed[batch['name']] = rows_processed.get(batch['name'], 0) + batch['rows_processed'] if batch['rows_processed'] else 0
    for batch in batches:
        pipeline_processed[batch['name']] = pipeline_processed.get(batch['name'], 0) + batch['pipelines'] if batch['pipelines'] else 0
print(list(rows_processed.values()))
print(list(pipeline_processed.values()))

Один способ с использованием двухуровневого defaultdict и Булевых операций:

>>> from collections import defaultdict
>>>
>>> d = defaultdict(lambda: defaultdict(int))
>>> for batch in batches:
...     d['Rows Processed'][batch['name']] += batch['rows_processed'] or 0
...     d['Pipelines Processed'][batch['name']] += batch['pipelines'] or 0
... 
>>> list(d['Rows Processed'].values())
[0, 0, 4, 0]
>>> list(d['Pipelines Processed'].values())
[1, 4, 2, 2]
Вернуться на верх