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

基于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']]}
]

问题分析与解决方案

现有代码的问题

  1. 对比逻辑错误:直接对比整个子列表,但实际需求是按子列表第一个元素(如'A'、'B')作为标识判断,时间变化不视为新增/移除。
  2. zip的局限性:当两组data长度不一致时,zip会截断数据,导致新增/移除的标识无法被检测。
  3. 数据存储格式不符:预期结果是字典结构,但现有代码尝试存储列表,不符合需求。
  4. 判断条件无效: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:58:12