首页 > 解决方案 > 比较两个字典的字典列表中的特定值

问题描述

我有两个字典列表。我正在遍历它们并寻找匹配的 id。如果 src_dict 中的 id 与目标匹配,我需要调用更新方法,否则调用插入方法。当我使用下面的代码时,我得到了意想不到的结果。

这就是我想要的结果。在更新时,我需要将 dest dict 中的 rec_id 与 src dict 中的相应值一起保留。insert 几乎只是不在 dest dict 中的 src dict 元素。感谢任何帮助!

records_update = [{'rec_id': 'abc', 'fields': {'id': 111, 'name': 'sam'}}, {'rec_id': 'xyz', 'fields': {'id': 333, 'name': 'name_changed_to_not_ross'}}]
#. the rec_id is from dest_dict while rest of the field should come from src_dict since these values could change that needs to be update
records_insert = [{"id": 444, "name": "jack"}]

src_dict = [{"id": 111, "name": "sam"}, {"id": 333, "name": "name_changed_to_not_ross"}, {"id": 444, "name": "jack"}]

dest_dict = [{"rec_id":"abc","fields":{"id":111,"name":"sam"}}, 
                {"rec_id":"pqr","fields":{"id":222,"name":"john"}},
                 {"rec_id":"xyz","fields":{"id":333,"name":"ross"}}]


records_update = []
records_insert = []
for rec_src in src_dict:
        for rec_dest in dest_dict:
            if rec_src['id'] == rec_dest['fields']['id']:
                print('match and add this element to update list')
                records_update.append(rec_src)
            else:
                print('no match add this element to insert list')
                records_insert.append(rec_src)```

标签: pythonpython-3.x

解决方案


您可以创建一个由 ID 索引的 dict 以dest_dict进行高效查找,然后使用列表推导来过滤src_dict相应的记录:

dest = {d['fields']['id']: d for d in dest_dict}
records_update = [dest[d['id']] for d in src_dict if d['id'] in dest]
records_insert = [d for d in src_dict if d['id'] not in dest]

推荐阅读