[python] Suma podle klice slovniku v seznamu

2013-04-15 Tema obsahu Jaroslav Lukesh

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@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] Suma podle klice slovniku v seznamu

2013-04-15 Tema obsahu starenka .
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 luk...@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@py.cz
 http://www.py.cz/mailman/listinfo/python
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] Suma podle klice slovniku v seznamu

2013-04-15 Tema obsahu azurIt
Ahoj,

nie som si isty, ci na toto najdes nejaky 'jednoduchy figel'. Proste to prejdi 
jednym cyklom a hodnoty spocitaj do druheho slovniku.

azur



__
 Od: Jaroslav Lukesh luk...@seznam.cz
 Komu: Konference PyCZ python@py.cz
 Dátum: 15.04.2013 21:59
 Predmet: [python] Suma podle klice slovniku v seznamu

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@py.cz
http://www.py.cz/mailman/listinfo/python

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


Re: [python] Suma podle klice slovniku v seznamu

2013-04-15 Tema obsahu Honza Javorek
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 . staren...@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 luk...@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@py.cz
  http://www.py.cz/mailman/listinfo/python
 ___
 Python mailing list
 Python@py.cz
 http://www.py.cz/mailman/listinfo/python

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

Re: [python] Suma podle klice slovniku v seznamu

2013-04-15 Tema obsahu Jan Bednařík
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.javo...@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 . staren...@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 luk...@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@py.cz
  http://www.py.cz/mailman/listinfo/python
 ___
 Python mailing list
 Python@py.cz
 http://www.py.cz/mailman/listinfo/python



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

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