使用 Python 对元组中每个给定的第一个值求和元组中的第二个值
Sum second value in tuple for each given first value in tuples using Python
我正在处理大量记录,需要对每个客户帐户的给定字段求和以达到总体帐户余额。虽然我可能可以以任何合理的形式放置数据,但我认为最简单的方法是在处理每条记录时使用元组列表 (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) 的列表。我想我可以弄清楚如何将每个值添加到列表中?
关于更好的方法有什么想法吗?
提前谢谢你。
下面的代码有用吗?
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}
import collections
def total(records):
dct = collections.defaultdict(int)
for cust_id, contrib in records:
dct[cust_id] += contrib
return dct.items()
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)]
这是一个 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
我正在处理大量记录,需要对每个客户帐户的给定字段求和以达到总体帐户余额。虽然我可能可以以任何合理的形式放置数据,但我认为最简单的方法是在处理每条记录时使用元组列表 (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) 的列表。我想我可以弄清楚如何将每个值添加到列表中?
关于更好的方法有什么想法吗?
提前谢谢你。
下面的代码有用吗?
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}
import collections
def total(records):
dct = collections.defaultdict(int)
for cust_id, contrib in records:
dct[cust_id] += contrib
return dct.items()
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)]
这是一个 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