比较旧dict list和新dict list,找出所有list对象的键和值之间的差异

2024-09-22 14:22:36 发布

您现在位置:Python中文网/ 问答频道 /正文

有很多问题;关于比较直接old dictnew dict的堆栈溢出

  • 我想比较一个旧的dict列表和一个新的dict列表,找出删除、添加和更新的内容
old_dict = [{'name':'john','age':10},{'name':'cena','age':26},{'name':'tom','age':24}]
new_dict = [{'name':'cena','age':26},{'name':'john','age':13},{'name':'henry','age':32},{'name':'steave','age':50}]

我想通过old_dict&new_dict作为函数的参数,其中比较所有列表对象中的键、值;该函数将返回以下字段

return updated_key_val,added_key_val,removed_new_key_val
print(updated_key_val)
>> [{'name':'john','age':13}] ### age value updated from 10 to 13

print(added_key_val)
>> [{'name':'henry','age':32},{'name':'steave','age':50}] ## old results doesn't had this 2 dicts so this are new dicts

print(removed_new_key_val)
>> [{'name':'tom','age':24}] ## this has been removed in newer results



Tags: keyname列表newagevalthisjohn
1条回答
网友
1楼 · 发布于 2024-09-22 14:22:36

因为当“name”字段相等时,每个字典都被认为是相等的,所以您可以为这些条目建立旧名称的索引,然后在对新条目进行一次迭代后跟踪更新、添加和删除的内容

def entries_diff(old_entries, new_entries):
    updated, added = [], []
    old_index = {e['name']: e for e in old_entries}
    for e in new_entries:
        name = e['name']
        if name not in old_index:
            added.append(e)
        else:
            old = old_index[name]
            if old != e:
                updated.append(e)
            del old_index[name]

    removed = list(old_index.values())
    return updated, added, removed

它给出了虚拟数据的预期结果

相关问题 更多 >