Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 16, 2015 17:10:16

slepov
Зарегистрирован: 2015-04-04
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

Есть список содержащий словари:

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

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

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

Офлайн

#2 Апрель 16, 2015 20:20:23

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

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}]

Офлайн

#3 Апрель 17, 2015 00:55:09

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

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']



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Апрель 17, 2015 00:56:23)

Офлайн

#4 Апрель 17, 2015 08:49:59

slepov
Зарегистрирован: 2015-04-04
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

А если задачу слегка усложнить, например словари имеют несколько большее количество пар ключ:значение.

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

Офлайн

#5 Апрель 17, 2015 09:07:24

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

slepov
А если задачу слегка усложнить, например словари имеют несколько большее количество пар ключ:значение.
и что длать с новыми парами? проверять или складывать?



————————————————
-*- Simple is better than complex -*-

Офлайн

#6 Апрель 17, 2015 09:18:16

slepov
Зарегистрирован: 2015-04-04
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

terabayt
и что длать с новыми парами? проверять или складывать?

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

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

Ничего не делать, просто возвращать . Причем пар может быть произвольное количество, но всегда одинаковое во всех словарях списка. При этом будем считать что все пары кроме val имеют зависимость от пары `id`, то есть для одинаковых `id` cчитаем, что все остальные пары в словаре одинаковы.

Офлайн

#7 Апрель 17, 2015 10:58:51

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

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()

Офлайн

#8 Апрель 17, 2015 11:11:42

slepov
Зарегистрирован: 2015-04-04
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

Спасибо это ОНО!

Офлайн

#9 Апрель 19, 2017 17:44:34

killik_23
Зарегистрирован: 2017-04-19
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

Подскажите, как сделать тоже самое, но только не складывать значение ‘val’, а выбрать наибольшее из списка словарей?

Отредактировано killik_23 (Апрель 19, 2017 17:46:34)

Офлайн

#10 Апрель 19, 2017 17:59:27

killik_23
Зарегистрирован: 2017-04-19
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сложить значения словарей в списке

Решил так, скажите, это оптимальный вариант?

 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()

Отредактировано killik_23 (Апрель 19, 2017 17:59:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version