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

如何修改Python的get_deleted函数以获取正确的字典列表删除项?

如何区分字典列表中的条目删除与值修改并获取被删除的条目

我需要对比两个包含列表的字典,仅获取**被删除(而非值修改)**的条目。现有代码会把值修改的条目也误判为删除,如何修改get_deleted函数得到期望输出?要求仅使用Python标准库。


解决方案

核心逻辑是区分「键存在但值修改」和「键完全消失/条目数量减少」:

  • 先将两个字典中每个主机的条目按子列表第一个元素(键)分组,统计每个键对应的所有值
  • 对比同一键在前后字典中的条目数量:
    • 若current中无该键 → 该键对应的所有prev条目都算删除
    • 若prev中该键的条目数量多于current → 多出来的条目算删除
    • 若数量相同(即使值不同),判定为值修改,不算删除

修改后的完整代码

from collections import defaultdict

prev = {'HOST_A': [['OS_TYPE', 'AIX'], ['HAS_COBOL', '0'], ['HAS_TUXEDO', '0'], ['IP', '10.111.160.68'], ['IP', '10.111.160.66'], ['IP', '10.95.0.112']]}

current = {'HOST_A': [['OS_TYPE', 'LINUX'], ['HAS_COBOL', '0'], ['HAS_TUXEDO', '1']]}


# return a dict that contains what is missing in current data
def get_deleted(a, b):
    answer = {}
    for host, prev_entries in a.items():
        try:
            current_entries = b[host]
        except KeyError:
            # 若current中无此主机,可按需将所有prev条目标记为删除,此处保持原逻辑跳过
            continue
        
        # 按key分组current中的条目
        current_groups = defaultdict(list)
        for key, val in current_entries:
            current_groups[key].append(val)
        
        # 按key分组prev中的条目
        prev_groups = defaultdict(list)
        for key, val in prev_entries:
            prev_groups[key].append(val)
        
        deleted = []
        for key, prev_vals in prev_groups.items():
            current_vals = current_groups.get(key, [])
            # 计算需删除的条目数量:prev数量 - current数量
            delete_count = len(prev_vals) - len(current_vals)
            if delete_count > 0:
                # 取最后delete_count个条目(需取最早的则改为prev_vals[:delete_count])
                deleted.extend([[key, val] for val in prev_vals[-delete_count:]])
        
        if deleted:
            answer[host] = deleted
    return answer


b = get_deleted(prev, current)
print('result dict:', b)

for k, v in b.items():
    if isinstance(v, list):
        for value in v:
            print(k, value[0].rstrip(), value[1].rstrip())

输出结果

result dict: {'HOST_A': [['IP', '10.111.160.68'], ['IP', '10.111.160.66'], ['IP', '10.95.0.112']]}
HOST_A IP 10.111.160.68
HOST_A IP 10.111.160.66
HOST_A IP 10.95.0.112

不使用defaultdict的替代实现

如果不想依赖collections.defaultdict,可以用普通字典手动分组:

# 替换current_groups的构建
current_groups = {}
for key, val in current_entries:
    if key not in current_groups:
        current_groups[key] = []
    current_groups[key].append(val)

# 替换prev_groups的构建
prev_groups = {}
for key, val in prev_entries:
    if key not in prev_groups:
        prev_groups[key] = []
    prev_groups[key].append(val)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:03:11