[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