Python将2个字典列表合并为一个字典列表的最快方法

nif*_*eco 0 python dictionary list python-3.x

ldict1 = [{"id":1, "name":"apple", "colour": "", "type": ""}, 
          {"id":2, "name":"orange", "colour": "", "type":""}]
ldict2 = [{"id":1, "colour":"red", "type":"fruit"}, 
          {"id":2, "colour":"orange", "type":"fruit"}]
Run Code Online (Sandbox Code Playgroud)

上面是我想要合并的两种类型的字典列表的示例。两者的 id 相同。两者的长度都很长。我只能想到嵌套 for 循环,但这可能需要时间。合并相同内容的最快方法是什么?

预期的

ldict = [{"id":1, "name":"apple", "colour": "red", "type": "fruit"}, 
         {"id":2, "name":"orange", "colour": "orange", "type":"fruit"}]
Run Code Online (Sandbox Code Playgroud)

请注意,两个列表始终具有相同的 id 顺序。ldict1另外,我想添加from缺少的细节ldict2。这些键始终为空,ldict1需要用 来填充ldict2

小智 5

你可以尝试:

out = [{**i, **j} for i,j in zip(ldict1, ldict2)]
Run Code Online (Sandbox Code Playgroud)

或者如果您的 Python>=3.9:

out = [i | j for i,j in zip(ldict1, ldict2)]
Run Code Online (Sandbox Code Playgroud)

输出:

[{'id': 1, 'name': 'apple', 'colour': 'red', 'type': 'fruit'},
 {'id': 2, 'name': 'orange', 'colour': 'orange', 'type': 'fruit'}]
Run Code Online (Sandbox Code Playgroud)

id请注意,只有当s 与每对i-匹配时,这才有效j。此外,如果某个键在 和 中都有值i,则仅保留j来自的值。j

另外,(可能与双循环没有什么不同,但是)如果ids 不匹配,我们可以使用 pandas 模块并使用它的fillna方法:

import pandas as pd
out = pd.DataFrame(ldict1).replace('', float('nan')).fillna(pd.DataFrame(ldict2)).to_dict('records')
Run Code Online (Sandbox Code Playgroud)