Python 3.x中以list1为索引聚合list2元素的实现问题
解决按索引求和的问题
嘿,作为Python新手能想到用zip()把两个列表配对已经很棒啦!接下来其实很简单,咱们一步步来实现:
思路拆解
- 先确定最终列表
final的长度:要覆盖list1里出现的最大索引,所以取max(list1) + 1,这样能包含从0到最大索引的所有位置,初始值都设为0.0。 - 遍历你已经组合好的
new列表,每一组是(索引, 对应浮点数),把浮点数加到final对应索引的位置上就行。
完整代码实现
list1 = [1, 2, 2, 2, 3, 5] list2 = [0.0, 2.0, 3.0, 1.0, 4.0, 3.0] # 用zip组合两个列表 new = zip(list1, list2) # 确定final的长度:最大索引+1,初始全为0.0 max_index = max(list1) final = [0.0] * (max_index + 1) # 遍历每一组,累加对应索引的值 for idx, num in new: final[idx] += num print(final) # 输出: [0.0, 0.0, 6.0, 4.0, 0.0, 3.0]
代码解释
max(list1)找到list1里最大的索引是5,所以final的长度是6,初始是[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]。- 循环里的
idx是list1的元素(也就是要存到final的索引),num是list2对应位置的浮点数,每次把num加到final[idx]上,就完成了累加。 - 因为list1里没有0和4,所以final这两个位置保持初始的0.0,正好符合你要的结果!
额外小技巧(可选)
如果以后遇到更复杂的类似需求,也可以用Python的collections.defaultdict来实现,代码会更简洁:
from collections import defaultdict list1 = [1, 2, 2, 2, 3, 5] list2 = [0.0, 2.0, 3.0, 1.0, 4.0, 3.0] sum_dict = defaultdict(float) for idx, num in zip(list1, list2): sum_dict[idx] += num # 把字典转换成要求的列表,覆盖所有0到最大索引的位置 max_index = max(list1) final = [sum_dict.get(i, 0.0) for i in range(max_index + 1)] print(final) # 同样输出正确结果
这个方法先用字典存每个索引的累加值,最后再转成列表,适合索引不连续或者范围很大的情况~
内容的提问来源于stack exchange,提问作者microjrm
相关产品推荐
相关产品推荐

