[python] Suma podle klice slovniku v seznamu

Jirka Vejrazka jirka.vejrazka na gmail.com
Úterý Duben 16 09:56:59 CEST 2013


Trochu mi unika, proc se tady resi onelinery, kdyz uz starenka napsal
skvele reseni pres collections.Counter, ktery je k tomu primo urceny :)

   Jirka


2013/4/16 Petr Přikryl <prikryl at atlas.cz>

> Ahoj všeci,
>
> Já bych přece jen zůstal u těch cyklů a pořádně to okomentoval. Jedna věc
> je
> nějak to napsat a druhá věc je být schopný  po roce znovu pochopit, co jsem
> tím myslel (v lepším případě) nebo co tím myslel někdo druhý (v tom
> horším).
>
> lst1 = [{'a':4,'b':3},{'a':4,'b':5},{'a':1,'b':3},{'a':3,'b':2}]
> print('puvodni seznam slovniku:', lst1)
>
> lst2 = [(x['a'], x['b']) for x in lst1]
> print('seznam dvojic hodnot:', lst2)
>
> d = {}
> for a, b in lst2:
>     d[a] = d.get(a, 0) + b  # dosavadní součet nebo nula plus nová hodnota
> print('slovnik sum:', d)
>
> lst3 = [{'a': a, 'b': b} for a, b in d.items()]
> print('vysledny seznam:', lst3)
>
> Když vynecháte ty tři meziprinty, není to ani moc dlouhé.
>
> Kdo má chuť a čas, mohl by zkusit nějaký větší příklad a timeit.
>
> Ona je ale otázka, jak vůbec vznikl ten původní seznam. Připadá mi to
> jako databázová tabulka se sloupci A a B. Jestli by nebylo lepší použít
> opravdovou tabulku (sqlite) a opravdový SQL dotaz.
>
> Mějte se fajn,
>     Petr
>
> ______________________________________________________________
> > Od: "Jan Bednařík" <jan.bednarik at gmail.com>
> > Komu: Konference PyCZ <python at py.cz>
> > Datum: 16.04.2013 00:32
> > Předmět: Re: [python] Suma podle klice slovniku v seznamu
> >
> >Myslím že to využití groupby je parádní. Je to snadno čitelné, jednoduché
> a
> >elegantní řešení. Těžko to půjde napsat čitelnějí pomocí cyklů. Ostatně
> >právě kvůli tomuto příkladu existuje funkce groupby.
> >
> >Jen bych to lehce vylepšil použitím operator.itemgetter místo těch lambda
> >funkcí, tzn.:
> >
> >from operator import itemgetter
> >
> >get_a = itemgetter('a')
> >get_b = itemgetter('b')
> >
> >
> >
> >2013/4/15 Honza Javorek <jan.javorek at gmail.com>
> >
> >> Jde to samozřejmě v podstatě one-linerem, ale bude to nečitelný.
> >>
> >>
> >>
> >> from itertools import groupby
> >>
> >>
> >> def summarize(data):
> >>     get_b = lambda x: x['b']
> >>     get_a = lambda x: x['a']
> >>     return (
> >>         {'a': val, 'b': sum(map(get_b, group))}
> >>         for (val, group)
> >>         in groupby(data, key=get_a)
> >>     )
> >>
> >> data = [{'a': 4, 'b': 3}, {'a': 4, 'b': 5}, {'a': 1, 'b': 3}, {'a': 3,
> >> 'b': 2}]
> >> print list(summarize(data))  # [{'a': 4, 'b': 8}, {'a': 1, 'b': 3},
> {'a':
> >> 3, 'b': 2}]
> >>
> >>
> >>
> >> Já bych to udělal normálně cyklama, ať se v tom jde vyznat.
> >>
> >> H
> >>
> >>
> >>
> >> 2013/4/15 starenka . <starenka0 at gmail.com>
> >>
> >> Ahoj, dal sem si malyho panaka, abych to pochopil, ale porad nechapu,
> >>> pokud by ti nahodou slo o sumu cisel u klicu, tak collections.Counter:
> >>>
> >>> >>> import collections
> >>> >>> c = collections.Counter()
> >>> >>> for one in
> [{'a':4,'b':3},{'a':4,'b':5},{'a':1,'b':3},{'a':3,'b':2}]:
> >>> ...     c.update(one)
> >>> ...
> >>> >>> c
> >>> Counter({'b': 13, 'a': 12})
> >>>
> >>> Ale asi chces neco jinyho, v tom pripade mi to asi lip vysvetli,
> >>> protoze jsem z pomalejsich
> >>>
> >>> s
> >>> ---
> >>> In Perl you shoot yourself in the foot, but nobody can understand how
> >>> you did it. Six months later, neither can you. | print
> >>> 'aknerats'[::-1]
> >>>
> >>>
> >>> 2013/4/15 Jaroslav Lukesh <lukesh at seznam.cz>:
> >>> > Dobrý den,
> >>> >
> >>> > existuje na toto nějaký jednoduchý fígl?
> >>> >
> >>> > mám zdroj (první dva slovníky jsou za sebou abyste je nemuseli
> hledat,
> >>> jinak
> >>> > jsou rozmístěná všeljak)
> >>> > [{'a':4,'b':3},{'a':4,'b':5},{'a':1,'b':3},{'a':3,'b':2}]
> >>> >
> >>> > a chci ve výsledku sesumírovat všecky b podle stejného klíče a,
> takto:
> >>> >
> >>> > [{'a':4,'b':8},{'a':1,'b':3},{'a':3,'b':2}]
> >>> >
> >>> > hodnota klíče a je obecná, tedy je to text, ne číslo.
> >>> >
> >>> > Děkuji, JL.
> >>> > _______________________________________________
> >>> > Python mailing list
> >>> > Python at py.cz
> >>> > http://www.py.cz/mailman/listinfo/python
> >>> _______________________________________________
> >>> Python mailing list
> >>> Python at py.cz
> >>> http://www.py.cz/mailman/listinfo/python
> >>>
> >>
> >>
> >> _______________________________________________
> >> Python mailing list
> >> Python at py.cz
> >> http://www.py.cz/mailman/listinfo/python
> >>
> >
> >
> >----------
> >
> >_______________________________________________
> >Python mailing list
> >Python at py.cz
> >http://www.py.cz/mailman/listinfo/python
> >
> _______________________________________________
> Python mailing list
> Python at py.cz
> http://www.py.cz/mailman/listinfo/python
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.py.cz/pipermail/python/attachments/20130416/e69a2959/attachment.html>


Další informace o konferenci Python