Python合并二维数组部分重复项及代码优化需求
优化二维数组相似元素合并方案
嘿,针对你要合并二维数组中相似元素的需求,我来给你一套更高效简洁的实现方案!先明确你的核心需求:以数组前三个元素的组合作为唯一标识,将对应第四个数值累加,其余不重复的项保持原样。
原数组与期望结果
原输入数组:
readTaskList = [ ["Red", "Blue", "Yellow", 5], ["Red", "Blue", "Yellow", 10], ["Red", "Blue", "Green", 5], ["Red", "Blue", "Green", 5], ["Red", "Blue", "Orange", 5], ["Red", "Blue", "Violet", 5] ]
期望输出数组:
[ ["Red", "Blue", "Yellow", 15], ["Red", "Blue", "Green", 10], ["Red", "Blue", "Orange", 5], ["Red", "Blue", "Violet", 5] ]
现有代码的问题分析
你的现有实现用到了嵌套循环和列表存在性检查,这种方式的时间复杂度是O(n²),当数据量较大时效率会很低;而且代码逻辑比较冗余,可读性也有待提升。
优化方案:利用字典实现O(n)时间复杂度的合并
我们可以用字典的键唯一性来快速定位重复项,把前三个元素的元组作为键(因为列表不能当字典键,元组可以),对应的值用来累加数值。这里推荐两种实现方式:
方式1:普通字典实现
from typing import List def merge_task_list(task_list: List[List]) -> List[List]: merge_dict = {} for item in task_list: # 取前三个元素作为唯一键 key = tuple(item[:3]) value = item[3] if key in merge_dict: merge_dict[key] += value else: merge_dict[key] = value # 将字典转换回二维数组 return [list(key) + [value] for key, value in merge_dict.items()] # 测试调用 readTaskList = [ ["Red", "Blue", "Yellow", 5], ["Red", "Blue", "Yellow", 10], ["Red", "Blue", "Green", 5], ["Red", "Blue", "Green", 5], ["Red", "Blue", "Orange", 5], ["Red", "Blue", "Violet", 5] ] final_task_list = merge_task_list(readTaskList) print(final_task_list)
方式2:用collections.defaultdict简化代码
from collections import defaultdict from typing import List def merge_task_list(task_list: List[List]) -> List[List]: merge_dict = defaultdict(int) for item in task_list: key = tuple(item[:3]) merge_dict[key] += item[3] # 转换为目标数组格式 return [list(key) + [value] for key, value in merge_dict.items()]
整合你现有代码中的workType替换逻辑
如果需要保留你代码里的workType替换处理,可以把这部分逻辑整合到合并后的步骤中:
from collections import defaultdict from typing import List def merge_and_transform_task_list(task_list: List[List], work_type_list: List[List]) -> List[List]: # 第一步:合并相似项 merge_dict = defaultdict(int) for item in task_list: key = tuple(item[:3]) merge_dict[key] += item[3] # 第二步:处理workType替换 final_list = [] for key, total_value in merge_dict.items(): category1, category2, work_type = key # 处理work_type的空格替换和匹配 new_work_type_parts = work_type.replace(" ", "_").split("_") if len(new_work_type_parts) > 1: work_type = f"{new_work_type_parts[0]} {new_work_type_parts[1]}" # 匹配workTypeList进行替换 for wt in work_type_list: if category2 == wt[0] and work_type == wt[1]: work_type = wt[2] break # 组装最终项 final_list.append([category1, category2, work_type, total_value]) return final_list # 示例workTypeList(根据你的需求调整) workTypeList = [ ["Blue", "Green", "DarkGreen"], # 其他匹配规则... ] # 调用测试 final_task_list = merge_and_transform_task_list(readTaskList, workTypeList) print(final_task_list)
优化点总结
- 时间效率提升:从原来的O(n²)降到O(n),数据量越大优势越明显
- 代码简洁性:去掉了冗余的嵌套循环和列表检查,逻辑更清晰
- 可维护性:拆分了合并和转换逻辑,后续修改需求更方便
内容的提问来源于stack exchange,提问作者Maylin Anne
相关产品推荐
相关产品推荐

