5

谁能给我一个提示如何聚合(总结)多个列表的特定元素?

例如,我有 20 个具有相似名称模式的列表,每个列表代表相应家庭(代理)随时间推移的消费支出(即索引):

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

我需要诸如 value = sum of index 之类的东西c_agent_*[whatever]

4

3 回答 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]
于 2013-07-17T11:32:12.523 回答
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 的解决方案 :)。

于 2013-07-17T11:30:11.870 回答
2

如果您想对所有列执行此操作,那么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().

于 2013-07-17T11:35:48.287 回答