You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:01