如何合并列表中首元素相同的元组并对第二个元素求和?
合并元组列表中首元素相同的项并求和
我来帮你搞定这个问题!先拆解下你原代码里的问题,再给你几个简单好用的解决方案~
原代码的问题分析
你写的这段代码有几个关键问题,导致没法实现预期效果:
if item[0] in item:这个判断逻辑完全不对,item是一个元组(比如('d2', 1)),item[0]是元组的第一个元素,它必然存在于当前元组中,所以这个判断永远为True,根本起不到“检查是否已经存在相同首元素”的作用。sums = sum[item[1]]这里有语法错误:sum是Python内置的求和函数,需要用括号调用(比如sum([1,2,3])),而且你这里没有任何累加逻辑,只是想取当前元组的第二个元素,完全用错了方式。new.append((item[0],item1[1]))这里的item1是未定义的变量,应该是item,但即使修正了,这段代码也只是把每个元组重复添加到new列表里,完全没有合并相同首元素的逻辑。
正确的解决方案
方法1:使用普通字典统计(兼容所有Python版本)
字典的键是唯一的,正好可以对应元组的首元素,值用来累加第二个元素:
tuples = [('d2', 1), ('d2', 1), ('d3', 1), ('d10', 1), ('d10', 1), ('d15', 1), ('d165', 1), ('d165', 1), ('d172', 1),('d2', 1)] # 初始化空字典用于统计 count_dict = {} for key, value in tuples: if key in count_dict: # 键已存在,累加对应的值 count_dict[key] += value else: # 键不存在,初始化值 count_dict[key] = value # 将字典转换为元组列表 result = list(count_dict.items()) print(result) # 输出:[('d2', 3), ('d3', 1), ('d10', 2), ('d15', 1), ('d165', 2), ('d172', 1)]
(注:你的预期输出里('d10',1)应该是笔误,原列表里d10出现了两次,正确求和结果应为2)
如果需要保持元组首次出现的顺序,Python3.7及以上版本的普通字典默认保留插入顺序,直接用上面的代码即可;如果是Python3.6及以下版本,可以用collections.OrderedDict代替普通字典。
方法2:使用collections.Counter(更简洁)
Counter是Python标准库中专门用来统计频次的工具,这里因为每个元组的第二个元素都是1,我们可以直接统计首元素的出现次数:
from collections import Counter tuples = [('d2', 1), ('d2', 1), ('d3', 1), ('d10', 1), ('d10', 1), ('d15', 1), ('d165', 1), ('d165', 1), ('d172', 1),('d2', 1)] # 提取所有首元素,用Counter统计频次 counter = Counter(key for key, _ in tuples) # 转换为元组列表 result = list(counter.items()) print(result) # 输出和上面一致:[('d2', 3), ('d3', 1), ('d10', 2), ('d15', 1), ('d165', 2), ('d172', 1)]
如果元组的第二个元素可能不是1(比如有('d2', 2)这样的项),可以用循环累加的方式:
from collections import Counter tuples = [('d2', 1), ('d2', 2), ('d3', 3)] counter = Counter() for key, value in tuples: counter[key] += value result = list(counter.items()) # 输出:[('d2', 3), ('d3', 3)]
内容的提问来源于stack exchange,提问作者Ghostinshell
相关产品推荐
相关产品推荐

