Форум сайта python.su
Есть список содержащий словари:
[{'id': 1, 'val':1}, {'id': 2, 'val':3}, {'id': 1, 'val':4} ]
[{'id': 1, 'val':5}, {'id': 2, 'val':3} ]
Офлайн
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}]
Офлайн
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']
Отредактировано terabayt (Апрель 17, 2015 00:56:23)
Офлайн
А если задачу слегка усложнить, например словари имеют несколько большее количество пар ключ:значение.
[{'id': 1, 'val':1, 'a': 'd'}, {'id': 2, 'val':3, 'a': 'b' }, {'id': 1, 'val':4, 'a': 'c'} ]
Офлайн
slepovи что длать с новыми парами? проверять или складывать?
А если задачу слегка усложнить, например словари имеют несколько большее количество пар ключ:значение.
Офлайн
terabayt
и что длать с новыми парами? проверять или складывать?
[{'id': 1, 'val':1, 'a': 'd'}, {'id': 2, 'val':3, 'a': 'b' }, {'id': 1, 'val':4, 'a': 'd'} ]
Офлайн
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()
Офлайн
Спасибо это ОНО!
Офлайн
Подскажите, как сделать тоже самое, но только не складывать значение ‘val’, а выбрать наибольшее из списка словарей?
Отредактировано killik_23 (Апрель 19, 2017 17:46:34)
Офлайн
Решил так, скажите, это оптимальный вариант?
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)
Офлайн