如何修改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
相关产品推荐
相关产品推荐

