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

如何对比变更前后的列表,分别提取移除、新增的元素?

无位置依赖的列表差异检测实现方案

需求描述

实现列表变更的差异检测逻辑:给定列表变更前后的两个版本,识别变更过程中被移除的元素和新增的元素,检测过程不要求匹配元素位置,允许列表元素顺序、整体长度发生变化,重复元素按实际出现次数的差值统计。

示例输入输出

初始列表:[1, 1, 2, 5, 7, 7]
变更后列表:[1, 2, 2, 5, 6, 7, 4]
期望输出:

  • 移出元素列表 itemsOut = [1,7]
  • 移入元素列表 itemsIn = [2, 6, 4]

实现思路

因为列表存在重复元素,直接使用集合差集会丢失重复次数信息,因此采用频次统计的方案实现:

  • 分别统计旧列表、新列表中每个元素的出现次数
  • 遍历所有出现过的元素,对比两个列表中的频次差值
    • 若元素在旧列表的出现次数高于新列表,多出的部分即为被移除的元素,按差值个数追加到移出列表
    • 若元素在新列表的出现次数高于旧列表,多出的部分即为新增的元素,按差值个数追加到移入列表
  • 最终返回拼接完成的移出、移入列表即可

代码实现(Python)

from collections import Counter

def calc_list_diff(old_list: list, new_list: list):
    old_count = Counter(old_list)
    new_count = Counter(new_list)

    items_out = []
    items_in = []

    # 统计移出元素
    for val, cnt in old_count.items():
        diff = cnt - new_count.get(val, 0)
        if diff > 0:
            items_out += [val] * diff

    # 统计移入元素
    for val, cnt in new_count.items():
        diff = cnt - old_count.get(val, 0)
        if diff > 0:
            items_in += [val] * diff

    return items_out, items_in


# 测试用例验证
old_list = [1, 1, 2, 5, 7, 7]
new_list = [1, 2, 2, 5, 6, 7, 4]
itemsOut, itemsIn = calc_list_diff(old_list, new_list)
print(itemsOut)  # 输出: [1, 7]
print(itemsIn)   # 输出: [2, 6, 4]

注:如果业务场景只需要去重后的差异元素、不需要统计重复元素的个数差,直接对两个列表做集合运算即可,但该方式无法满足示例中重复元素的差值统计要求。

内容的提问来源于stack exchange,提问作者WoutN2001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.10 16:15:46