基于XOR门逻辑对比字典变量并分类存储的Python实现问题
基于XOR逻辑对比字典数据的Python问题解决
需求说明
作为Python入门学习者,需基于XOR门逻辑对比两组字典数据(设定a=previous_data,b=current_data):
- 0、1:新增数据(标识仅在current_data中存在)
- 1、0:移除数据(标识仅在previous_data中存在)
- 1、1:相同数据(标识在两组数据中都存在,时间变化不影响判定)
需将结果分别存入add、remove、same列表,并生成整合后的final列表,但现有代码输出不符合预期,请求解决。
现有代码
previous_data=[ {'id':1,'data':[]}, {'id':2,'data':[['A','11:00:00']]}, {'id':3,'data':[['A','11:00:00'],['B','11:00:00']]}, {'id':4,'data':[['A','11:00:00']]}, {'id':5,'data':[['A','11:00:00'],['B','11:00:00']]}, {'id':6,'data':[]} ] current_data=[ {'id':1,'data':[['A','12:00:00']]}, {'id':2,'data':[]}, {'id':3,'data':[['A','12:00:00'],['B','12:00:00']]}, {'id':4,'data':[['A','12:00:00'],['B','12:00:00']]}, {'id':5,'data':[['A','12:00:00']]}, {'id':6,'data':[]} ] count=0 data_add=[] data_remove=[] data_same=[] for sub_prev,sub_current in zip(previous_data,current_data): for prev,curr in zip(sub_prev['data'],sub_current['data']): if not prev and curr: print(f"Add ID:{sub_current['id']}") for data in curr: print(f"data:{data}") data_add.append([sub_current['id'],data]) elif prev and not curr: print(f"Remove ID:{sub_current['id']}") for data in curr: print(f"data:{data}") elif prev and curr: print(f"same ID:{sub_current['id']}") for data in prev: print(f"data:{data}") print(data_add)
当前代码输出
same ID:3 data:A data:11:00:00 same ID:3 data:B data:11:00:00 same ID:4 data:A data:11:00:00 same ID:5 data:A data:11:00:00 []
预期结果
add = [ {'id':1,'data':[['A','12:00:00']]}, {'id':4,'data':[['B','12:00:00']]} ] remove = [ {'id':2,'data':[['A','11:00:00']]}, {'id':5,'data':[['B','11:00:00']]} ] same= [ {'id':3,'data':[['A','11:00:00'],['B','11:00:00']]}, {'id':4,'data':[['A','11:00:00']]}, {'id':5,'data':[['A','11:00:00']]} ] final=[ {'id':1,'data':[['A','12:00:00']]}, {'id':3,'data':[['A','11:00:00'],['B','11:00:00']]}, {'id':4,'data':[['A','11:00:00'],['B','12:00:00']]}, {'id':5,'data':[['A','11:00:00']]} ]
问题分析与解决方案
现有代码的问题
- 对比逻辑错误:直接对比整个子列表,但实际需求是按子列表第一个元素(如'A'、'B')作为标识判断,时间变化不视为新增/移除。
zip的局限性:当两组data长度不一致时,zip会截断数据,导致新增/移除的标识无法被检测。- 数据存储格式不符:预期结果是字典结构,但现有代码尝试存储列表,不符合需求。
- 判断条件无效:
not prev判断子列表是否为空,但prev是如['A','11:00:00']的非空列表,永远无法触发新增/移除逻辑。
修正后的代码
previous_data=[ {'id':1,'data':[]}, {'id':2,'data':[['A','11:00:00']]}, {'id':3,'data':[['A','11:00:00'],['B','11:00:00']]}, {'id':4,'data':[['A','11:00:00']]}, {'id':5,'data':[['A','11:00:00'],['B','11:00:00']]}, {'id':6,'data':[]} ] current_data=[ {'id':1,'data':[['A','12:00:00']]}, {'id':2,'data':[]}, {'id':3,'data':[['A','12:00:00'],['B','12:00:00']]}, {'id':4,'data':[['A','12:00:00'],['B','12:00:00']]}, {'id':5,'data':[['A','12:00:00']]}, {'id':6,'data':[]} ] add = [] remove = [] same = [] final = [] # 按id配对两组数据(确保id一一对应) for prev_item, curr_item in zip(previous_data, current_data): id_ = prev_item['id'] prev_data = prev_item['data'] curr_data = curr_item['data'] # 构建标识到数据的映射,快速查找对应元素 prev_map = {item[0]: item for item in prev_data} curr_map = {item[0]: item for item in curr_data} prev_keys = set(prev_map.keys()) curr_keys = set(curr_map.keys()) # 计算新增、移除、相同的元素 added = [curr_map[key] for key in curr_keys - prev_keys] removed = [prev_map[key] for key in prev_keys - curr_keys] same_items = [prev_map[key] for key in prev_keys & curr_keys] # 存入对应列表 if added: add.append({'id': id_, 'data': added}) if removed: remove.append({'id': id_, 'data': removed}) if same_items: same.append({'id': id_, 'data': same_items}) # 构建final列表:相同元素(取previous的) + 新增元素(取current的) final_data = same_items + added if final_data: final.append({'id': id_, 'data': final_data}) # 按预期格式打印结果 print("add = [") for item in add: print(f" {item},") print("]") print("\nremove = [") for item in remove: print(f" {item},") print("]") print("\nsame = [") for item in same: print(f" {item},") print("]") print("\nfinal = [") for item in final: print(f" {item},") print("]")
输出结果
运行代码后,输出将与预期结果完全一致:
add = [ {'id': 1, 'data': [['A', '12:00:00']]}, {'id': 4, 'data': [['B', '12:00:00']]}, ] remove = [ {'id': 2, 'data': [['A', '11:00:00']]}, {'id': 5, 'data': [['B', '11:00:00']]}, ] same = [ {'id': 3, 'data': [['A', '11:00:00'], ['B', '11:00:00']]}, {'id': 4, 'data': [['A', '11:00:00']]}, {'id': 5, 'data': [['A', '11:00:00']]}, ] final = [ {'id': 1, 'data': [['A', '12:00:00']]}, {'id': 3, 'data': [['A', '11:00:00'], ['B', '11:00:00']]}, {'id': 4, 'data': [['A', '11:00:00'], ['B', '12:00:00']]}, {'id': 5, 'data': [['A', '11:00:00']]}, ]
内容的提问来源于stack exchange,提问作者exxyzza
相关产品推荐
相关产品推荐

