代码之家  ›  专栏  ›  技术社区  ›  Dicky Raambo

python中具有相同代码的sum list对象值

  •  0
  • Dicky Raambo  · 技术社区  · 6 年前

    我是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,但仍然没有得到我需要的。 有什么帮助吗?。。。

    4 回复  |  直到 6 年前
        1
  •  2
  •   Netwave    6 年前

    没错,用 groupby sum comprehensions : 正如评论中所说,使用groupby列表需要预先排序。 此外,您还可以使用 operator.attrgetter 而不是 key sorted .

    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)
    

    结果:

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

    live example

        2
  •  1
  •   Arkistarvh Kltzuonstev    6 年前

    这是一个没有任何导入的oneliner:

    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'}]
    
        3
  •  0
  •   Jonas Byström    6 年前
    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'}]