【问题标题】:Sum second value in tuple for each given first value in tuples using Python使用Python对元组中每个给定的第一个值求和元组中的第二个值
【发布时间】:2015-02-24 21:04:19
【问题描述】:

我正在处理大量记录,需要对每个客户帐户的给定字段求和,以达到总体帐户余额。虽然我可能可以以任何合理的形式放置数据,但我认为在处理每条记录时最简单的方法是元组列表 (cust_id,balance_contribution)。在一轮处理之后,我想为每个 cust_id 添加第二项,并且我试图在不循环数据数千次的情况下做到这一点。

例如,输入数据可能如下所示:[(1,125.50),(2,30.00),(1,24.50),(1,-25.00),(2,20.00)]

我希望输出是这样的:

[(1,125.00),(2,50.00)]

我读过其他问题,人们只想使用 sum(i for i, j in a) 的形式添加元组的第二个元素的值,但这确实将它们与第一个元素分开。

这个讨论,python sum tuple list based on tuple first value,将值作为分配给字典中每个键 (cust_id) 的列表。我想我可以弄清楚如何在列表中添加每个值?

对更好的方法有什么想法吗?

提前谢谢你。

【问题讨论】:

    标签: python list sum


    【解决方案1】:
    import collections
    
    def total(records):
        dct = collections.defaultdict(int)
        for cust_id, contrib in records:
            dct[cust_id] += contrib
    
        return dct.items()
    

    【讨论】:

    • 答案中的代码最适合我现有的代码,余额以列表形式返回,减少了进一步处理。如果我需要进行查找,那么我认为@beiller 的解决方案会是最好的。
    • 我真的很感谢其他人。在某些时候,我想尝试 Uri Goren's,因为我想改进我的单线。
    【解决方案2】:

    下面的代码有用吗?

    in_list = [(1,125.50),(2,30.00),(1,24.50),(1,-25.00),(3,20.00)]
    totals = {}
    for uid, x in in_list :
       if uid not in totals :
          totals[uid] = x
       else :
          totals[uid] += x
    
    print(totals)
    

    输出:

    {1: 125.0, 2: 30.0, 3: 20.0}
    

    【讨论】:

    • 我想是的。让我处理一下。关于字典的工作原理,我还有很多东西要学习:-)。我一会儿就回来。
    【解决方案3】:

    人们通常喜欢python中的单行:

    [(uk,sum([vv for kk,vv in data if kk==uk])) for uk in set([k for k,v in data])]
    

    什么时候

    data=[(1,125.50),(2,30.00),(1,24.50),(1,-25.00),(3,20.00)]
    

    输出是

    [(1, 125.0), (2, 30.0), (3, 20.0)]
    

    【讨论】:

      【解决方案4】:

      这是一个 itertools 解决方案:

      from itertools import groupby
      >>> x
      [(1, 125.5), (2, 30.0), (1, 24.5), (1, -25.0), (2, 20.0)]
      >>> sorted(x)
      [(1, -25.0), (1, 24.5), (1, 125.5), (2, 20.0), (2, 30.0)]
      >>> for a,b in groupby(sorted(x), key=lambda item: item[0]): 
          print a, sum([item[1] for item in list(b)])
      1 125.0
      2 50.0
      

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-14
        • 2011-06-07
        相关资源
        最近更新 更多