请问有谁能给我一个提示,如何对多个列表中的特定元素进行聚合(求和)?
例如,我有20个名称模式相似的列表,每个列表表示相应家庭(代理人)在一段时间内的消费支出(即指数):
c_agent_0 = [10.0, 11.0, ...]
.
.
.
c_agent_19 = [8.0, 9.0, ...]
我需要类似于 value = c_agent_*[任何值] 的索引总和。
使用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]
zip()
实际上的作用,你可能需要给出更好的解释。它会转置可迭代对象中的可迭代对象(第一行变为第一列等等...)。 - Gareth Lattyimport 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]
mylist
应该在不单独构建 c_agent_0
、c_agent_1
等的情况下构建。数据结构可以避免您输入大量重复的代码。mylist = [[10.0, 11.0, ...], [13.0, 14.0, ...], ...]
或者如果您以另一种方式构造数据,则更改代码以生成列表的列表。 - Gareth Lattysum([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()
的参数。
c_agent_0
是一个严重的警告信号 - 如果你有一堆带编号名字的变量,你应该使用列表替代。在这里你可以简单地使用一个列表的列表。 - Gareth Latty