如何提取元组元素并对其进行求和聚合操作?
问题描述
给定以下元组列表:
lits_tuple = [ ("x1", "x2", "x3", "x4", 2), ("x1", "x4", 80), ("x4", "z1", 24)]
每个元组的最后一个元素为数值类型(整数或浮点数),需将元组中除最后一个元素外的所有字符串键,对应累加该元组的数值,最终得到每个键的总数值。预期结果如下:
{"x1": 82}:x1在第一个元组对应2,第二个对应80,总和82{"x2": 2}:x2仅在第一个元组对应2{"x3": 2}:x3仅在第一个元组对应2{"x4": 106}:x4在第一个元组对应2,第二个对应80,第三个对应24,总和106{"z1": 24}:z1仅在最后一个元组对应24
之前尝试手动提取元组元素,但未完成通用实现,已写的代码片段如下:
tuple1 = lits_tuple[0] last_element_tuple1 = tuple1[-1] range_other_element_tuple1 = [i for i in range(len(lits_tuple[0])-1) ] len_other_element_tuple1 = len(lits_tuple[0])-1
last_element_tuplek = lits_tuple[k-1][-1] range_other_element_tuplek = [i for i in range(len(lits_tuple[k-1])-1) ] len_other_element_tuplek = len(lits_tuple[k-1])-1
通用实现方案
可以用字典存储每个键的累加值,遍历每个元组拆分出键列表和对应数值,再逐个键完成累加:
lits_tuple = [ ("x1", "x2", "x3", "x4", 2), ("x1", "x4", 80), ("x4", "z1", 24)] result = {} for item in lits_tuple: # 拆分键列表和数值:前n-1个元素是键,最后一个是数值 keys = item[:-1] value = item[-1] # 遍历每个键,累加对应数值 for key in keys: if key in result: result[key] += value else: result[key] = value # 按预期格式输出结果 for k, v in result.items(): print({k: v})
代码说明
- 初始化空字典
result用于存储最终累加结果 - 遍历每个元组:
- 用切片
item[:-1]提取当前元组的所有键,item[-1]获取对应的数值 - 对每个键,检查是否已在字典中:存在则累加数值,不存在则初始化为当前数值
- 用切片
- 最后遍历字典,输出每个键值对
运行代码后会得到预期输出:
{'x1': 82} {'x2': 2} {'x3': 2} {'x4': 106} {'z1': 24}
如果想简化判断逻辑,也可以用collections.defaultdict实现:
from collections import defaultdict lits_tuple = [ ("x1", "x2", "x3", "x4", 2), ("x1", "x4", 80), ("x4", "z1", 24)] result = defaultdict(int) for item in lits_tuple: keys = item[:-1] value = item[-1] for key in keys: result[key] += value for k, v in result.items(): print({k: v})
方案通用性说明
- 无论每个元组包含多少个键(只要最后一个元素是数值),切片
item[:-1]都能正确提取所有键 - 自动遍历所有元组和键,处理重复键的累加逻辑,无需针对单个元组编写硬编码逻辑
内容的提问来源于stack exchange,提问作者Shck Tchamna
相关产品推荐
相关产品推荐

