通过比较有效地更新字典列表

时间:2018-10-25 06:49:43

标签: python list dictionary

我有两个字典,

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)

它可以工作,但是我需要更好,更有效的方法。

2 个答案:

答案 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'}]