将列表与python中的嵌套dictionary和dictionary合并


dict1 = {'cost1': {'A': '22.727549567', 'B': '22.4940797544', 'C': '19.2819629649', 'D': '24.9302268902', 'E': '28.7951523193', 'F': '17.0993721357', 'G': '322.3279015934'}, 'cost2': {'A': 1511.7474897264, 'B': 2234.0384991703, 'C': 1811.299631493, 'D': 1394.9521800232997, 'E': 2717.4205026055, 'F': 2853.2642152811995, 'G': 63.0732507946}}
list1=[{'name': 'C','owner': 'System', 'status': 'ACTIVE'}, {'name': 'B', 'createdAt': '342 days 18 hours ago', 'owner': 'System', 'status': 'ACTIVE'}, {'name': 'C', 'createdAt': '205 days 4 hours ago', 'owner': 'ps', 'status': 'ACTIVE'}, {'name': 'A', 'createdAt': '342 days 17 hours ago', 'owner': 'System', 'status': 'ACTIVE'}, {'name': 'G', 'createdAt': '279 days 5 hours ago', 'owner': 'sb', 'status': 'ACTIVE'}, {'name': 'E', 'createdAt': '167 days 19 hours ago', 'owner': 'uk', 'status': 'ACTIVE'}, {'name': 'D', 'createdAt': '2 hours 2 mins ago', 'owner': 'uk', 'status': 'ACTIVE'}, {'name': 'F', 'createdAt': '1 days 10 hours ago', 'owner': 'chu', 'status': 'ACTIVE'}]
Result=[{'name': 'C','owner': 'System', 'status': 'ACTIVE'}, {'name': 'B', 'createdAt': '342 days 18 hours ago', 'owner': 'System', 'status': 'ACTIVE', 'cost_1': <value from dict1> ,'cost_2': < value from dict 1>}, {'name': 'C', 'createdAt': '205 days 4 hours ago', 'owner': 'ps', 'status': 'ACTIVE','cost_1': <value from dict1> ,'cost_2': < value from dict 1>}, {'name': 'A', 'createdAt': '342 days 17 hours ago', 'owner': 'System', 'status': 'ACTIVE', 'cost_1': <value from dict1> ,'cost_2': < value from dict 1>}, {'name': 'G', 'createdAt': '279 days 5 hours ago', 'owner': 'sb', 'status': 'ACTIVE', 'cost_1': <value from dict1> ,'cost_2': < value from dict 1>}, {'name': 'E', 'createdAt': '167 days 19 hours ago', 'owner': 'uk', 'status': 'ACTIVE', 'cost_1': <value from dict1> ,'cost_2': < value from dict 1>}, {'name': 'D', 'createdAt': '2 hours 2 mins ago', 'owner': 'uk', 'status': 'ACTIVE', 'cost_1': <value from dict1> ,'cost_2': < value from dict 1>}, {'name': 'F', 'createdAt': '1 days 10 hours ago', 'owner': 'chu', 'status': 'ACTIVE', 'cost_1': <value from dict1> ,'cost_2': < value from dict 1>}]

想要将dict1中的cost1和cost2-per合并到list1中,如结果所示。

一个单一的理解就可以做到:

result = [
d if 'createdAt' not in d
else d | {k: sub[d['name']] for k, sub in dict1.items()}
for d in list1
]
print(result)

结果:

[{'name': 'C', 'owner': 'System', 'status': 'ACTIVE'}, {'name': 'B', 'createdAt': '342 days 18 hours ago', 'owner': 'System', 'status': 'ACTIVE', 'cost1': '22.4940797544', 'cost2': 2234.0384991703}, {'name': 'C', 'createdAt': '205 days 4 hours ago', 'owner': 'ps', 'status': 'ACTIVE', 'cost1': '19.2819629649', 'cost2': 1811.299631493}, {'name': 'A', 'createdAt': '342 days 17 hours ago', 'owner': 'System', 'status': 'ACTIVE', 'cost1': '22.727549567', 'cost2': 1511.7474897264}, {'name': 'G', 'createdAt': '279 days 5 hours ago', 'owner': 'sb', 'status': 'ACTIVE', 'cost1': '322.3279015934', 'cost2': 63.0732507946}, {'name': 'E', 'createdAt': '167 days 19 hours ago', 'owner': 'uk', 'status': 'ACTIVE', 'cost1': '28.7951523193', 'cost2': 2717.4205026055}, {'name': 'D', 'createdAt': '2 hours 2 mins ago', 'owner': 'uk', 'status': 'ACTIVE', 'cost1': '24.9302268902', 'cost2': 1394.9521800232997}, {'name': 'F', 'createdAt': '1 days 10 hours ago', 'owner': 'chu', 'status': 'ACTIVE', 'cost1': '17.0993721357', 'cost2': 2853.2642152811995}]

说明:

  • 结果是字典列表
  • 如果字典不包含'createdAt'键,则应将其原样包含
  • 如果字典确实有该键,则应使用dict1中的键和选定值进行更新,"|"符号将使用另一个更新一个字典
  • 这些值是使用正在处理的字典中的名称来选择的,即d['name']
  • 原始列表1中的所有词典都会一次处理一个

最新更新