Сложение списка словарей

Есть два списка:

list_one = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]

list_two = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]

Нужно их сложить так что бы получился третий такого вида:

list_three = [{"name": "Alex", "value": 2}, {"name": "Bob", "value": 4}]

Первые два списка словарей всегда будут одинаковые по длине и словари будут отличатся только значением "value". То есть поле "name" первого словаря будет совпадать с полем "name" первого элемента второго словаря. Через цикл не совсем корректно это делать, так как словарей в списке может быть до тысячи.


Ответы (1 шт):

Автор решения: strawdog

Вы, конечно, можете поизощряться с модулем collections, но мне кажется, что работа с табличным форматом будет и удобнее и быстрее:

import pandas as pd
list_one = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]
list_two = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]
res = pd.DataFrame(list_one+list_two).groupby("name", as_index=False).sum().to_dict("records")
print(res)

[{'name': 'Alex', 'value': 2}, {'name': 'Bob', 'value': 4}]

UPDATE:

Если нужно складывать значения по модулю (абсолютные), то делаем так:

res = pd.DataFrame(list_one+list_two).groupby("name", as_index=False)["value"].apply(lambda x:x.abs().sum()).to_dict("records")

UPDATE 2:

Для вычитания можно сделать так (принимая во внимание, что списков всего два):

res = pd.DataFrame(list_one+list_two).groupby("name", as_index=False)["value"].apply(lambda x:x.iloc[0] - x.iloc[-1]).to_dict("records")
→ Ссылка