如何对N个列表中的元素进行求和?

5

请问有谁能给我一个提示,如何对多个列表中的特定元素进行聚合(求和)?

例如,我有20个名称模式相似的列表,每个列表表示相应家庭(代理人)在一段时间内的消费支出(即指数):

c_agent_0 = [10.0, 11.0, ...]
.
.
.
c_agent_19 = [8.0, 9.0, ...]

我需要类似于 value = c_agent_*[任何值] 的索引总和。

1
请问您能否举个例子进一步说明您的问题? - Sukrit Kalra
6
c_agent_0 是一个严重的警告信号 - 如果你有一堆带编号名字的变量,你应该使用列表替代。在这里你可以简单地使用一个列表的列表。 - Gareth Latty
3个回答

7

使用zip将列表“合并”为单个列表,然后对每个索引的元素进行求和:

c_agent_0 = [10.0, 11.0, 12.0, 13.0, 14.0]
c_agent_1 = [1.1, 12.3, 14.2, 13.2, 14.3]
c_agent_2 = [1.4, 12.1, 14.5, 13.1, 14.2]

zipped_list = zip(c_agent_0, c_agent_1, c_agent_2)

print zipped_list
print [sum(item) for item in zipped_list]

打印

[(10.0, 1.1, 1.4), (11.0, 12.3, 12.1), (12.0, 14.2, 14.5), (13.0, 13.2, 13.1), (14.0, 14.3, 14.2)]

[12.5, 35.4, 40.7, 39.3, 42.5]

1
使用zip将列表合并成一个 - 这并不是zip()实际上的作用,你可能需要给出更好的解释。它会转置可迭代对象中的可迭代对象(第一行变为第一列等等...)。 - Gareth Latty
好的,同意,谢谢。我刚刚添加了文档链接,标记为带引号合并,并改进了代码示例。 - alecxe
在我看来,将zip称为将列表“组合”成“单个列表”仍然是具有误导性的。这让人感觉像是“合并”。我不得不仔细阅读整篇文章才能理解正在发生的事情。也许可以说一些类似这样的话:“使用zip制作一个列表的列表,其中第一个子列表包含每个原始列表的第一个元素,依此类推。” - ToolmakerSteve

4
您可以创建一个列表的列表,然后使用NumPy数组:
import numpy as np
c_agent_0 = [10.0, 11.0, 12.0]
c_agent_1 = [13.0, 14.0, 15.0]
c_agent_2 = [16.0, 17.0, 18.0]
mylist = [c_agent_0, c_agent_1, c_agent_2]
mylist = sum(map(np.array, mylist))
print mylist[0]

请注意,列表推导可能更快;这只是使用numpy的解决方案 :).

问题是关于对(本质上)列求和,而不仅仅是列表。 - Gareth Latty
@Lattyware 编辑了我的回答 :3 - TerryA
非常感谢您迄今为止的帮助。问题在于列表的数量可能会变得很大(例如400个家庭),因此任何需要输入列表名称的解决方案都不是很方便。到目前为止,我还没有想出如何使用字符串通配符*并对所有符合名称模式c_agent_*的列表进行求和。 - JohnDoe
@JohnDoe 的意思是 mylist 应该在不单独构建 c_agent_0c_agent_1 等的情况下构建。数据结构可以避免您输入大量重复的代码。mylist = [[10.0, 11.0, ...], [13.0, 14.0, ...], ...] 或者如果您以另一种方式构造数据,则更改代码以生成列表的列表。 - Gareth Latty
@Lattyware:你说得对,我已经用循环创建了mylist。谢谢。 - JohnDoe

3
如果您想对所有列执行此操作,则alecxe的答案是最佳选择,如果您只想处理单个列(或子集),那么这会浪费很多不必要的处理。
对于单个列(在本例中为第三列):
sum([c_agent[2] for c_agent in c_agents])

我们使用内置函数sum()来对列表求和,同时还要借助一个简单的列表推导式来获取每个列表中的第n个元素。需要注意的是,这里假设你有一个列表的列表,而不是许多单独的变量:
c_agents = [c_agent_0, c_agent_1, ...]

有效地使用数据结构将使您的代码变得更好。

先前提到的基于 zip() 的解决方案也可以轻松地修改为适用于此数据结构:

[sum(column) for column in zip(*c_agent_s)]

在这里,我们使用*运算符将列表解包为zip()的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接