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


_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

Odpovedet emailem