Dicky Raambo
Dicky Raambo

Reputation: 523

sum list object value with same code in python

I am a beginner in python, I have faced some problem. I have an object list like this :

[  
    {  
        'balance':-32399.0,
        'code':u'1011',
        'name':u'Stock Valuation Account'
    },
    {  
        'balance':-143503.34,
        'code':u'1011',
        'name':u'Stock Interim Account (Received)'
    },
    {  
        'balance':117924.2499995,
        'code':u'1011',
        'name':u'Stock Interim Account (Delivered)'
    },
    {  
        'balance':-3500000.0,
        'code':u'1101',
        'name':u'Cash'
    },
    {  
        'balance':-50000.0,
        'code':u'1101',
        'name':u'Other Cash'
    },
]

I need to sum it based on the code, so the result will be.

[  
    {  
        'balance':6819,91,
        'code':u'1011',
    },
    {  
        'balance':-3550000.0,
        'code':u'1101',
    },
]

have search over StackOverflow, but still not got what I need. any help?...

Upvotes: 0

Views: 251

Answers (3)

Arkistarvh Kltzuonstev
Arkistarvh Kltzuonstev

Reputation: 6920

Here is an oneliner without any import :

a = ...
result = [{'balance' : sum([i['balance'] for i in a if i['code']==j]), 'code' : j} for j in set([k['code'] for k in a])]

OUTPUT :

[{'balance': -3550000.0, 'code': '1101'}, {'balance': -57978.0900005, 'code': '1011'}]

Upvotes: 1

Jonas Byström
Jonas Byström

Reputation: 26129

data = [
    {
        'balance':-32399.0,
        'code':u'1011',
        'name':u'Stock Valuation Account'
    },
    ...
]
d = {}
for entry in data:
    d[entry['code']] = d.get(entry['code'],0) + entry['balance']
print([{'balance':b,'code':c} for c,b in d.items()])

Would print:

[{'balance': -57978.0900005, 'code': '1011'}, {'balance': -3550000.0, 'code': '1101'}]

Upvotes: 0

Netwave
Netwave

Reputation: 42678

Exactly, using groupby and sum within some comprehensions: As said in the comments, for using groupby the list need to be presorted. In addition you can use operator.attrgetter instead of lambdas in the key parameters of sorted and groupby.

l = [  
    {  
        'balance':-32399.0,
        'code':u'1011',
        'name':u'Stock Valuation Account'
    },
    ...
]

from itertools import groupby
import operator 

selector_func = operator.attrgetter("code")
l = sorted(l, key=selector_func)
result = [{"code" : code, "balance" : sum(x["balance"] for x in values)} for code, values in groupby(l, selector_func)]
print(result)

Result:

[{'code': '1011', 'balance': -57978.0900005}, {'code': '1101', 'balance': -3550000.0}]

Here you have the live example

Upvotes: 2

Related Questions