[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