python - 比较两个字典的字典列表中的特定值
问题描述
我有两个字典列表。我正在遍历它们并寻找匹配的 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)```
解决方案
您可以创建一个由 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]
推荐阅读
- elasticsearch - 两个日期字段的结果之间的差异然后取平均值
- mysql - 错误号:2013 查询期间丢失与 MySQL 服务器的连接
- flutter - 输入'_StreamHandlerTransformer
' 不是 'StreamTransformer 类型的子类型 , 动态>' - c# - WPF MVVM Listview:Leftdoubleclick 是否需要写入事件?
- excel - 第一次复制尝试时 VBA 中的“运行时错误 1004:工作表类的复制方法失败”
- spring - 调用 REST API 会导致内部服务器错误,如何调试?
- html - 无法在横向模式下使 svg 适合浏览器打印
- vuejs2 - 在 Vue 中,如何从 $ref 中获取 css 样式选择器?
- python - 有没有办法同步visdom更新?
- vba - 从组合框中删除项目时,最后一个项目被删除,但文本仍然存在......如何在最后一个项目被删除后使组合框变为空白?