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