Как сгруппировать элементы списка

Как можно из данного списка:

stats = [
{
   "userid": "123", 
   "nick": "user", 
   "count": 5
}, 

{
   "userid": "321", 
   "nick": "user2", 
   "count": 5
}, 

{
   "userid": "123", 
   "nick": "user", 
   "count": 5
}
]

Сделать такой:

[
{
   "userid": "123", 
   "nick": "user", 
   "count": 10
}, 

{
   "userid": "321", 
   "nick": "user2", 
   "count": 5
}
]

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

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

Можно так:

stats = [
{
   "userid": "123", 
   "nick": "user", 
   "count": 5
}, 

{
   "userid": "321", 
   "nick": "user2", 
   "count": 5
}, 

{
   "userid": "123", 
   "nick": "user", 
   "count": 5
}
]

r = []
for stat in stats:
    if stat not in r:
        r += [stat]

print(r)
→ Ссылка
Автор решения: gil9red

Действия:

  • Объединение списка по userid в словарь с суммированием значения count
  • Получение значения словаря в список

Пример:

user_id_by_data = dict()
for x in stats:
    user_id = x['userid']
    if user_id not in user_id_by_data:
        user_id_by_data[user_id] = x
    else:
        data = user_id_by_data[user_id]
        data['count'] += x['count']

print(list(user_id_by_data.values()))
# [{'userid': '123', 'nick': 'user', 'count': 10}, {'userid': '321', 'nick': 'user2', 'count': 5}]
→ Ссылка