Python实现:按tuple分组对四整数list对应索引值求和
按Tuple分组并对对应列表逐索引求和
我有一个大型的子列表集合,每个子列表由一个tuple和一个包含4个整数的list组成。需要生成一个包含唯一tuple的列表,对每个tuple对应的list中相同索引的整数分别求和(保持四个整数独立)。
示例输入
[[(30, 40), [4, 7, 7, 1]],[(30, 40), [2, 9, 3, 4]],[(30, 40), [6, 5, 10, 0]],[(20, 40), [4, 0, 4, 0]],[(20, 40), [3, 4, 14, 5]],[(20, 40), [3, 2, 12, 0]],[(10, 40), [223, 22, 12, 9]]]
期望输出
[[(30, 40), [12, 21, 20, 5]],[(20, 40), [10, 6, 30, 5]],[(10, 40), [223, 22, 12, 9]]]
(注:原示例中(20,40)对应的列表结果有误,正确求和应为[4+3+3, 0+4+2, 4+14+12, 0+5+0] = [10,6,30,5])
错误代码分析
你尝试用字典实现,但代码中dict_tuples[item[0]] += item[1]是列表拼接操作,会把两个列表合并成一个长列表,而非对相同索引的元素求和,这是问题所在。
你的尝试代码:
l = [[(30, 40), [4, 7, 7, 1]],[(30, 40), [2, 9, 3, 4]],[(30, 40), [6, 5, 10, 0]],[(20, 40), [4, 0, 4, 0]],[(20, 40), [3, 4, 14, 5]],[(20, 40), [3, 2, 12, 0]],[(10, 40), [223, 22, 12, 9]]] dict_tuples = {} for item in l: if item[0] in dict_tuples: dict_tuples[item[0]] += item[1] else: dict_tuples[item[0]] = item[1]
正确实现方法
方法一:逐索引遍历求和
l = [[(30, 40), [4, 7, 7, 1]],[(30, 40), [2, 9, 3, 4]],[(30, 40), [6, 5, 10, 0]],[(20, 40), [4, 0, 4, 0]],[(20, 40), [3, 4, 14, 5]],[(20, 40), [3, 2, 12, 0]],[(10, 40), [223, 22, 12, 9]]] dict_tuples = {} for item in l: key = item[0] values = item[1] if key in dict_tuples: # 对每个索引位置的数值分别相加 for i in range(len(values)): dict_tuples[key][i] += values[i] else: # 复制列表避免修改原数据 dict_tuples[key] = values.copy() # 转换为目标格式 result = [[k, v] for k, v in dict_tuples.items()] print(result)
方法二:用zip和列表推导式简化求和
l = [[(30, 40), [4, 7, 7, 1]],[(30, 40), [2, 9, 3, 4]],[(30, 40), [6, 5, 10, 0]],[(20, 40), [4, 0, 4, 0]],[(20, 40), [3, 4, 14, 5]],[(20, 40), [3, 2, 12, 0]],[(10, 40), [223, 22, 12, 9]]] dict_tuples = {} for key, vals in l: if key in dict_tuples: # 用zip配对两个列表的元素,逐个求和 dict_tuples[key] = [sum(pair) for pair in zip(dict_tuples[key], vals)] else: dict_tuples[key] = vals.copy() result = [[k, v] for k, v in dict_tuples.items()] print(result)
两种方法都能得到正确的分组求和结果,方法二更简洁,且不依赖固定的列表长度(即使后续列表长度变化也能正常工作)。
内容的提问来源于stack exchange,提问作者MMPESH1
相关产品推荐
相关产品推荐

