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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:10:54