Найти - Пользователи
Полная версия: Как сложить значения словарей в списке
Начало » Python для новичков » Как сложить значения словарей в списке
1
slepov
Есть список содержащий словари:

[{'id': 1, 'val':1}, {'id': 2, 'val':3}, {'id': 1, 'val':4} ]

Если значения `id` одинаковы, то необходимо сложить значения `val`, то есть получить

[{'id': 1, 'val':5}, {'id': 2, 'val':3} ]
botinag
lst = [{'id': 1, 'val':1}, {'id': 2, 'val':3}, {'id': 1, 'val':4}]
def f(lst):
    dct = {}
    for x in lst:
        if x['id'] in dct:
            dct[x['id']] += x['val']
        else:
            dct[x['id']] = x['val']
    return [{'id': x, 'val': y} for x, y in dct.iteritems()]

>>> f(lst)
[{'id': 1, 'val': 5}, {'id': 2, 'val': 2}]
>>> lst = [{'id': 1, 'val':1}, {'id': 2, 'val':3}, {'id': 1, 'val':4}]
>>> f(lst)
[{'id': 1, 'val': 5}, {'id': 2, 'val': 3}]
terabayt
botinag
if x['id'] in dct:
    dct[x['id']] += x['val']
else:
    dct[x['id']] = x['val']
dct[x['id']] = dct.get(x['id'], 0) + x['val']
slepov
А если задачу слегка усложнить, например словари имеют несколько большее количество пар ключ:значение.
[{'id': 1, 'val':1, 'a': 'd'}, {'id': 2, 'val':3, 'a': 'b' }, {'id': 1, 'val':4, 'a': 'c'} ]
terabayt
slepov
А если задачу слегка усложнить, например словари имеют несколько большее количество пар ключ:значение.
и что длать с новыми парами? проверять или складывать?
slepov
terabayt
и что длать с новыми парами? проверять или складывать?

Упс… Ошибся в примере.

[{'id': 1, 'val':1, 'a': 'd'}, {'id': 2, 'val':3, 'a': 'b' }, {'id': 1, 'val':4, 'a': 'd'} ]

Ничего не делать, просто возвращать . Причем пар может быть произвольное количество, но всегда одинаковое во всех словарях списка. При этом будем считать что все пары кроме val имеют зависимость от пары `id`, то есть для одинаковых `id` cчитаем, что все остальные пары в словаре одинаковы.
bismigalis
data = [{'id': 1, 'val':1, 'a': 'd'}, {'id': 2, 'val':3, 'a': 'b' }, {'id': 1, 'val':4, 'a': 'c'} ]
def f(d, x):
    k = x['id']
    if k in d:
        d[k]['val'] += x['val']
    else:
        d[k] = x
    return d
print reduce(f, data, {}).values()
slepov
Спасибо это ОНО!
killik_23
Подскажите, как сделать тоже самое, но только не складывать значение ‘val’, а выбрать наибольшее из списка словарей?
killik_23
Решил так, скажите, это оптимальный вариант?
 data = [{'id': 1, 'val':1, 'a': 'd'}, {'id': 2, 'val':3, 'a': 'b' }, {'id': 1, 'val':4, 'a': 'c'} ]
def f(d, x):
    k = x['id']
    if k in d:
         d[k]['val'] = max(x['val'] for d in data)
    else:
        d[k] = x
    return d
print reduce(f, data, {}).values()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB