如何对比变更前后的列表,分别提取移除、新增的元素?
无位置依赖的列表差异检测实现方案
需求描述
实现列表变更的差异检测逻辑:给定列表变更前后的两个版本,识别变更过程中被移除的元素和新增的元素,检测过程不要求匹配元素位置,允许列表元素顺序、整体长度发生变化,重复元素按实际出现次数的差值统计。
示例输入输出
初始列表:
[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
相关产品推荐
相关产品推荐

