[python] Suma podle klice slovniku v seznamu

Jaroslav Lukesh lukesh na seznam.cz
Úterý Duben 16 15:06:05 CEST 2013


Ahoj a díky za rozšíření obzorů.

Jsou to data ne zrovna jednoduše vycucaná z databáze, o nějaké dočasné 
tabulcev sqlu  jsem uvažoval protože je nad tímto selektivně sečteným 
výsledkem víc operací, ale připadalo mi to jako ne příliš čisté řešení. 
Otrocky s pomocnýma proměnnýma to taky jde, ale chtěl jsem vědět, jeslti na 
to není nějaký fígl, protože mi připadalo logické, aby pro práci nad poli a 
slovníky bylo aspoň trochu něco jako je v sql.

Ale mám s tím trošku problém, izoloval jsem problém pro tento příklad až 
příliš moc, protože se mi nedaří jej rozšířit o 'c', tedy pro tento vstup 
(podotýkám jen, že hodnota 'c' je stejná pro všechny 'a'):

[{'a':4,'b':3,'c':9},{'a':4,'b':5,'c':9},{'a':1,'b':3,'c':7},{'a':3,'b':2,'c':6}]

chtěl tento výstup:

[{'a': 4, 'b': 8, 'c':9}, {'a': 1, 'b': 3, 'c':7}, {'a': 3, 'b': 2, 'c':6}]

Tady je přehled co jsem zkoušel, tyhle dvě jdou, ale vrací špatné 'c'

=========

lst1 = 
[{'a':4,'b':3,'c':9},{'a':4,'b':5,'c':9},{'a':1,'b':3,'c':7},{'a':3,'b':2,'c':6}]
lst2 = [(x['a'], x['b'], x['c']) for x in lst1]
d = {}
for a, b,c in lst2:
    d[a] = d.get(a, 0) + b  # dosavadní součet nebo nula plus nová hodnota
lst3 = [{'a': a, 'b': b, 'c': c} for a, b in d.items()]
print('vysledny seznam:', lst3)

======

from itertools import groupby
def summarize(data):
    get_b = lambda x: x['b']
    get_a = lambda x: x['a']
    get_c = lambda x: x['c']
    return (
        {'a': val, 'b': sum(map(get_b, group)),'c':val}
        for (val, group)
        in groupby(data, key=get_a)
    )
data= 
[{'a':4,'b':3,'c':9},{'a':4,'b':5,'c':9},{'a':1,'b':3,'c':7},{'a':3,'b':2,'c':6}]
print list(summarize(data))

=======

A toto už háže chybu

from itertools import groupby
from operator import itemgetter
def summarize(data):
    get_a = itemgetter('a')
    get_b = itemgetter('b')
    get_c = itemgetter('c')
    return (
        {'a': val, 'b': sum(map(get_b, group)),'c':valc}
        for (val, group,valc)
        in groupby(data, key=get_a)
    )
data= 
[{'a':4,'b':3,'c':9},{'a':4,'b':5,'c':9},{'a':1,'b':3,'c':7},{'a':3,'b':2,'c':6}]
print list(summarize(data))




Další informace o konferenci Python