Python中基于嵌套列表重复index0元素添加元素的方法问询
Python实现按子列表index0值分组并执行元素整合的方案
看起来你需要把已排序嵌套列表中,第0个元素(index0)相同的子列表归组,并执行对应的元素添加/整合操作。因为你的列表已经是按index0排序的,我们可以用几种高效的方式实现,下面分享两种常用方案:
方案1:利用itertools.groupby(推荐,适合已排序列表)
groupby是Python标准库中专门用于分组的工具,因为你的列表已经按index0连续排列,它能直接高效地完成分组:
from itertools import groupby from operator import itemgetter # 你的原始已排序列表 sorted_lst = [ ['04-0200', 'str1', '1', 'n1'], ['04-0200', 'str2', '6', 'n1,n2,n3,n4,n5,n6'], ['11-0200', 'str3', '1', 'u1'], ['19-0000', '', '2', ''], ['19-0201', 'str4', '2', ''], ['19-0201', 'str10', '3', 'p1,p2,p3'], ['22-0001', 'str5', '5', 'a1,a2,a3,a4'], ['22-0001', 'str6', '184', 'b1,b2,b3,b4,b5'], ['22-0001', 'str7', '2', 'c1,c2'], ['9-02011', 'str8', '3', '', 'x,y,z'] ] # 初始化结果字典,用于存储分组后的整合数据 grouped_result = {} # 按子列表的index0字段分组 for key, sublist_group in groupby(sorted_lst, key=itemgetter(0)): # 初始化当前分组的临时存储 collected_strings = [] total_number = 0 unique_items = set() # 遍历当前分组下的每个子列表,执行元素添加/整合操作 for sublist in sublist_group: # 收集非空的index1字符串 if sublist[1].strip(): collected_strings.append(sublist[1]) # 累加index2的数字(转换为int类型) total_number += int(sublist[2]) # 处理index3及以后的字段,拆分非空项并去重 for idx in range(3, len(sublist)): item_content = sublist[idx].strip() if item_content: unique_items.update(item_content.split(',')) # 将整合后的结果存入字典 grouped_result[key] = { 'combined_strings': ', '.join(collected_strings), 'sum_of_numbers': total_number, 'merged_unique_items': ', '.join(sorted(unique_items)) } # 可选:将字典转换为你需要的列表格式 final_output = [[key, val['combined_strings'], str(val['sum_of_numbers']), val['merged_unique_items']] for key, val in grouped_result.items()] print(final_output)
代码说明:
itemgetter(0)指定按子列表的第0个元素作为分组键- 你可以根据实际需求修改元素添加操作的逻辑:比如如果只是要收集同组的所有子列表,直接把
sublist_group转成列表即可,不需要后续的字段处理 - 这里的示例做了字符串收集、数字求和、多字段去重合并,你可以按需调整
方案2:用字典手动分组(兼容未排序列表)
如果你的列表后续可能变成未排序状态,或者你不想依赖itertools,可以用字典手动实现分组:
sorted_lst = [ ['04-0200', 'str1', '1', 'n1'], ['04-0200', 'str2', '6', 'n1,n2,n3,n4,n5,n6'], ['11-0200', 'str3', '1', 'u1'], ['19-0000', '', '2', ''], ['19-0201', 'str4', '2', ''], ['19-0201', 'str10', '3', 'p1,p2,p3'], ['22-0001', 'str5', '5', 'a1,a2,a3,a4'], ['22-0001', 'str6', '184', 'b1,b2,b3,b4,b5'], ['22-0001', 'str7', '2', 'c1,c2'], ['9-02011', 'str8', '3', '', 'x,y,z'] ] grouped_result = {} for sublist in sorted_lst: key = sublist[0] # 如果当前key未在字典中,初始化存储结构 if key not in grouped_result: grouped_result[key] = { 'strings': [], 'total': 0, 'items': set() } # 更新当前分组的数据 if sublist[1].strip(): grouped_result[key]['strings'].append(sublist[1]) grouped_result[key]['total'] += int(sublist[2]) for idx in range(3, len(sublist)): item_content = sublist[idx].strip() if item_content: grouped_result[key]['items'].update(item_content.split(',')) # 转换为最终列表格式 final_output = [] for key, data in grouped_result.items(): final_output.append([ key, ', '.join(data['strings']), str(data['total']), ', '.join(sorted(data['items'])) ]) print(final_output)
代码说明:
- 这个方法会逐个检查子列表的key,不存在就初始化,存在就直接更新分组数据,不管列表是否排序都能工作
- 逻辑和方案1一致,只是分组方式不同
简化版:仅分组不整合
如果你只是需要把同index0的子列表放在一起,不需要字段整合,代码会更简单:
from itertools import groupby from operator import itemgetter sorted_lst = [ ['04-0200', 'str1', '1', 'n1'], ['04-0200', 'str2', '6', 'n1,n2,n3,n4,n5,n6'], ['11-0200', 'str3', '1', 'u1'], ['19-0000', '', '2', ''], ['19-0201', 'str4', '2', ''], ['19-0201', 'str10', '3', 'p1,p2,p3'], ['22-0001', 'str5', '5', 'a1,a2,a3,a4'], ['22-0001', 'str6', '184', 'b1,b2,b3,b4,b5'], ['22-0001', 'str7', '2', 'c1,c2'], ['9-02011', 'str8', '3', '', 'x,y,z'] ] # 直接按index0分组,每个key对应所有子列表的集合 simple_grouped = {key: list(group) for key, group in groupby(sorted_lst, key=itemgetter(0))} # 打印分组结果 for key, sublists in simple_grouped.items(): print(f"分组键 {key} 对应的子列表:") print(sublists)
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

