结果合并两个字典列表并更新键

vin*_*man 3 python dictionary list

我有两个字典列表,解释某人和他们的角色,例如,下面的 L1 显示在其角色中由 D 指示的驱动程序,而 L2 在其角色中显示由 P 指示的包装工:

L1 = [
    {'D': 'Jim Jones'}, 
    {'D': 'Tom Jones'},
    {'D': 'Bob Jones'}
]

L2 = [
    {'P': 'Jim Jones'},
    {'P': 'Bob Jones'}
]
Run Code Online (Sandbox Code Playgroud)

我想合并字典列表,以便键是其角色的合并键,例如:

L3 = [
    {'DP': 'Jim Jones'}, 
    {'D': 'Tom Jones'},
    {'DP': 'Bob Jones'}
]
Run Code Online (Sandbox Code Playgroud)

顺序无关紧要,这可能是一个新列表,也可以就地完成

Ray*_*ger 5

这应该可以完成工作:

>>> scratch = {v : k for d in L1 for k, v in d.items()}
>>> for d in L2:
        for k, v in d.items():
            if v not in scratch:
                scratch['v'] = ''
            scratch[v] += k

>>> result = [{v: k} for k, v in scratch.items()]
>>> result
[{'DP': 'Jim Jones'}, {'D': 'Tom Jones'}, {'DP': 'Bob Jones'}]
Run Code Online (Sandbox Code Playgroud)

这是它在做什么:

步骤1)名称为关键字构建一个临时字典:

scratch = {'Jim Jones': 'D', 'Tom Jones': 'D', 'Bob Jones': 'D'}
Run Code Online (Sandbox Code Playgroud)

步骤 2)循环L2 中的名称,然后在scratch 中查找名称并更新其值。

scratch['Jim Jones'] += 'P'
Run Code Online (Sandbox Code Playgroud)

步骤 3)将临时字典转回字典列表:

result = [{'DP': 'Jim Jones'}, {'D': 'Tom Jones'}, {'DP': 'Bob Jones'}]
Run Code Online (Sandbox Code Playgroud)

解决问题的关键

核心思想是名称应该是单个字典中的键。这使得查找和更新变得容易。

希望这可以帮助 :-)