2015-02-24 229 views
1

我正在处理大量记录集,并且需要为每个客户帐户总计给定字段以达到总体帐户余额。虽然我可以将数据放在任何合理的形式,但我认为最简单的方法是在处理每条记录时,元组列表(cust_id,balance_contribution)。经过一轮处理后,我想为每个cust_id添加第二项,并且我试图在数千次数据循环中不循环数据。使用Python为元组中的每个给定第一个值计算元组的第二个值

作为一个例子,输入数据可能看起来像:[(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在a中)的形式添加元组的第二个元素的值,但是这确实将它们与第一个元素分开。

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

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

预先感谢您。

回答

2
import collections 

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

    return dct.items() 
+0

答案中的代码最适合我现有的代码,余额返回列表中,减少了进一步的处理。如果我需要查找,那么我认为@ beiller的解决方案将是最好的。 – 2015-02-25 13:05:06

+0

我非常欣赏其他人。在某个时候,我想试试Uri Goren's,因为我想要改善我的单挑。 – 2015-02-25 13:06:48

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} 
+0

我是这么认为的。让我一起工作一下。我仍然有很多需要了解字典是如何工作的:-)。我会回来的。 – 2015-02-24 21:18:14

0

人们通常喜欢的俏皮话在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)] 
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 
相关问题