[python] Suma podle klice slovniku v seznamu

Jan Bednařík jan.bednarik na gmail.com
Úterý Duben 16 00:31:39 CEST 2013


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 na 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 na 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 na 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 na py.cz
>> > http://www.py.cz/mailman/listinfo/python
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20130416/a343360d/attachment.html>


Další informace o konferenci Python