如果值相同,则合并两个字典列表

use*_*896 1 python dictionary pandas

我有两个字典列表,如下所示:

a = [
    {'name': 'john', 'exam 1': 'python'},
    {'name': 'chris', 'exam 1': 'java'},
    {'name': 'newman', 'exam 1': 'C'},
    {'name': 'sebast', 'exam 1': 'C#'},
    {'name': 'penier', 'exam 1': 'python'},
    {'name': 'alex', 'exam 1': 'go'},
    {'name': 'steve', 'exam 1': 'C#'}
]

b = [
    {'name': 'john', 'exam 2': 'django'},
    {'name': 'newman', 'exam 2': 'java'},
    {'name': 'sebast', 'exam 2': 'C'},
    {'name': 'chris', 'exam 2': 'C#'}
    {'name': 'penier', 'exam 2': 'python'},
    {'name': 'steve', 'exam 2': 'go'},
    {'name': 'alex', 'exam 2': 'C#'}
]
Run Code Online (Sandbox Code Playgroud)

我想将它们合并到一本字典中,如下所示:

c = [
    {'name': 'john', 'exam 1': 'python', 'exam 2': 'django'},
    {'name': 'chris', 'exam 1': 'java', 'exam 2': 'C#'},
    {'name': 'newman', 'exam 1': 'C', 'exam 2': 'java'},
    {'name': 'sebast', 'exam 1': 'C#', 'exam 2': 'C'},
    {'name': 'penier', 'exam 1': 'python', 'exam 2': 'python'},
    {'name': 'alex', 'exam 1': 'go', 'exam 2': 'C#'},
    {'name': 'steve', 'exam 1': 'C#', 'exam 2': 'go'}
]

Run Code Online (Sandbox Code Playgroud)

我已经尝试过以下方法:

for i, j in zip(a, b):
   if i['name'] == j['name']:
      c.update(i)
Run Code Online (Sandbox Code Playgroud)

我得到的结果只是一本字典,它添加了那些相同的行,而不是它们的位置不同的行。

Dan*_*ejo 5

您可以为每个列表创建两个查找字典,然后找到交集

import pprint

lookup_A = {d["name"]: d for d in A}
lookup_B = {d["name"]: d for d in B}

result = [{**value, **lookup_B.get(key, {})} for key, value in lookup_A.items()]
pprint.pprint(result)
Run Code Online (Sandbox Code Playgroud)

输出

[{'exam 1': 'python', 'exam 2': 'django', 'name': 'john'},
 {'exam 1': 'java', 'exam 2': 'C#', 'name': 'chris'},
 {'exam 1': 'C', 'exam 2': 'java', 'name': 'newman'},
 {'exam 1': 'C#', 'exam 2': 'C', 'name': 'sebast'},
 {'exam 1': 'python', 'exam 2': 'python', 'name': 'penier'},
 {'exam 1': 'go', 'exam 2': 'C#', 'name': 'alex'},
 {'exam 1': 'C#', 'exam 2': 'go', 'name': 'steve'}]
Run Code Online (Sandbox Code Playgroud)

更新

理解列表理解的一种更简单的方法是执行等效的 for 循环:

result= []
for key, value in lookup_A.items():
    result.append({**value, **lookup_B.get(key, {})})
Run Code Online (Sandbox Code Playgroud)

表达方式:

{**value, **lookup_B.get(key, {})}
Run Code Online (Sandbox Code Playgroud)

被称为字典解包,它在Python 3.5版本中被添加到