[python] Suma podle klice slovniku v seznamu

Jan Bednařík jan.bednarik na gmail.com
Úterý Duben 16 18:48:14 CEST 2013


2013/4/16 Jaroslav Lukesh <lukesh na seznam.cz>

> 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.
>


Je na to spousta nástrojů, třeba ty itertools. Chce to jen méně zkoušet
metodou pokus omyl a více koukat do nápovědy :-)



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



Jde to třeba takto (upravené řešení od Honzy Javorka):

from itertools import groupby
from operator import itemgetter

def summarize(data):
    return [{'a': a, 'b': sum(map(itemgetter('b'), group)), 'c': c} for (a,
c), group in groupby(data, itemgetter('a', 'c'))]


A kdybys to chtěl pomocí cyklů, tak třeba takto:

from itertools import groupby
from operator import itemgetter

def summarize(data):
    groups = groupby(data, itemgetter('a', 'c'))
    out = []
    for (a, c), group in groups:
        b = sum(map(itemgetter('b'), group))
        out.append({'a': a, 'b': b, 'c': c})
    return out


Honza
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20130416/810727d2/attachment.html>


Další informace o konferenci Python