使用Python将元组中每个给定的第一个值的元组中的第二个值求和

时间:2015-02-24 21:04:19

标签: python list sum

我正在处理大量记录,需要为每个客户帐户汇总一个字段,以达到整体帐户余额。虽然我可以以任何合理的形式提供数据,但我认为最容易的是当我处理每条记录时的元组列表(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代表i,j),但这确实将它们与第一个分开元件。

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

有关更好的方法的任何想法吗?

提前谢谢。

4 个答案:

答案 0 :(得分:2)

import collections

def total(records):
    dct = collections.defaultdict(int)
    for cust_id, contrib in records:
        dct[cust_id] += contrib

    return dct.items()

答案 1 :(得分:1)

以下代码是否有用?

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}

答案 2 :(得分:1)

人们通常喜欢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)]

答案 3 :(得分:1)

这是一个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