我有两个字典,
说
required = [
{"name": "a", "req_Key": "a"},
{"name": "b", "req_Key": "b"},
{"name": "c", "req_Key": "c"},
{"name": "d", "req_Key": "d"}
]
updated = [
{"name": "a", "output_id": "Oa"},
{"name": "d", "output_id": "Od"}
]
现在我需要通过与required
字典进行比较来更新updated
字典,
所以输出看起来像
[
{'req_Key': 'a', 'name': 'a', 'output_id': 'Oa'},
{'req_Key': 'b', 'name': 'b'},
{'req_Key': 'c', 'name': 'c'},
{'req_Key': 'd', 'name': 'd', 'output_id': 'Od'}
]
我正在使用循环来执行此操作,但是如何避免循环来有效地执行此操作?
示例代码:
required = [{"name":"a","req_Key":"a"},{"name":"b","req_Key":"b"},{"name":"c","req_Key":"c"},{"name":"d","req_Key":"d"}]
updated = [{"name":"a","output_id":"Oa"},{"name":"d","output_id":"Od"}]
for updated_record in updated:
for req_record in required:
if updated_record["name"] == req_record["name"]:
req_record.update(updated_record)
print(req_record)
它可以工作,但是我需要更好,更有效的方法。
答案 0 :(得分:1)
首先转换您的更新数据,以便获得恒定的查找时间:
update_data = {d['name']: d for d in update}
for d in required:
d.update(update_data.get(d['name'], {}))
这假设name
在您的更新数据中是唯一的。否则,您可以执行以下操作:
from collections import defaultdict
update_data = defaultdict(dict)
for d in update:
update_data[d['name']].update(d)
for d in required:
d.update(update_data.get(d['name'], {}))
这些方法都(O(N+M))
仅对每个列表进行一次迭代,这比嵌套列表方法(O(M*N))
有了显着改进。
答案 1 :(得分:0)
这是一种方法。
required = [{"name":"a","req_Key":"a"},{"name":"b","req_Key":"b"},{"name":"c","req_Key":"c"},{"name":"d","req_Key":"d"}]
updated = [{"name":"a","output_id":"Oa"},{"name":"d","output_id":"Od"}]
updated = dict((i["name"], i["output_id"]) for i in updated)
for i in required:
i.update({'output_id': updated.get(i["name"])})
print(required)
输出:
[{'output_id': 'Oa', 'req_Key': 'a', 'name': 'a'}, {'output_id': None, 'req_Key': 'b', 'name': 'b'}, {'output_id': None, 'req_Key': 'c', 'name': 'c'}, {'output_id': 'Od', 'req_Key': 'd', 'name': 'd'}]