python中具有相同代码的总和列表对象值

时间:2019-03-18 10:46:16

标签: python

我是python的初学者,我遇到了一些问题。我有一个这样的对象列表:

[  
    {  
        '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'
    },
]

我需要根据代码对其求和,结果将是这样。

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

已经在StackOverflow上进行了搜索,但是仍然没有得到我所需要的。 有帮助吗?...

3 个答案:

答案 0 :(得分:2)

确切地说,在某些groupby中使用sumcomprehensions: 如评论中所述,要使用groupby,需要对列表进行预排序。 另外,您可以在operator.attrgetterkey的{​​{1}}参数中使用sorted代替lambda。

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)

这里有live example

答案 1 :(得分:1)

这里是一个没有任何导入的班轮:

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])]

输出

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

答案 2 :(得分:0)

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()])

会打印:

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