Задать вопрос
@organica

Как сложить значения у одинаковых ключей в списке?

Господа, помогите пожалуйста советом: имеются следующие вводные:
Есть список, в котором лежат еще три списка, возвращаемые функциями
united_scores = [self.find_common_groups(), self.find_common_friends(), self.compare_and_set_score()]


Элементы вложенных списков - словари в следующем формате:
{'id': 359631473, 'score': 6}
{'id': 133979437, 'score': 2}
{'id': 53245825, 'score': 2}
{'id': 225959252, 'score': 2}


Задача: сложить значения ключей score для всех уникальных id.
Обшерстил весь интернет, максимум что получается- суммирование всех значений по id и score, в итоге получается:
def unite_lists(self):
        united_scores = [self.find_common_groups(), self.find_common_friends(), self.compare_and_set_score()]
        for element in united_scores:
            result = dict(functools.reduce(operator.add,
                                           map(collections.Counter, element)))
            print(result)


В Результате получаю сумму всех id и их score по трем входящим спискам...:
{'id': 47308545803, 'score': 2555}
{'id': 23604130033, 'score': 1340}
{'id': 12414787583, 'score': 946}


Как наиболее элегантно решить мою задачу?
  • Вопрос задан
  • 788 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
exibite777
@exibite777
Ведущий системный аналитик
Используйте пакет Pandas . Ваша задача решается в одну строку
import pandas as pd

lst=[{'id': 2785280, 'score': 13},
 {'id': 66560002, 'score': 4},
 {'id': 180432899, 'score': 7},
 {'id': 52793348, 'score': 5},
 {'id': 86411270, 'score': 5},
 {'id': 2334728, 'score': 2},
 {'id': 2523146, 'score': 4},
 {'id': 159318028, 'score': 5},
]

df=pd.DataFrame(lst)
df=df.groupby('id')['score'].sum()
Ответ написан
Комментировать
0xD34F
@0xD34F
flat = [ n for m in united_scores for n in m ]
ids = set(n['id'] for n in flat)
grouped = [ { 'id': n, 'score': sum(m['score'] for m in flat if m['id'] == n) } for n in ids ]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы