合并两个字典列表并更新键值

3
我有两个字典列表,解释了某人和他们的角色。例如,下面的L1显示了以D表示其角色的司机,而L2显示了以P表示其角色的打包工:
L1 = [
    {'D': 'Jim Jones'}, 
    {'D': 'Tom Jones'},
    {'D': 'Bob Jones'}
]

L2 = [
    {'P': 'Jim Jones'},
    {'P': 'Bob Jones'}
]

我想合并字典列表,以便键是它们角色的合并键,例如:
L3 = [
    {'DP': 'Jim Jones'}, 
    {'D': 'Tom Jones'},
    {'DP': 'Bob Jones'}
]

顺序不重要,这可以是一个新列表,也可以原地完成

3个回答

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

以下是它的作用:

步骤1)名称作为键构建一个scratch(暂存)字典:

scratch = {'Jim Jones': 'D', 'Tom Jones': 'D', 'Bob Jones': 'D'}

第二步) 遍历 L2 中的名称,然后在 scratch 中查找该名称并更新其值。

scratch['Jim Jones'] += 'P'

第三步) 将划痕字典转换回字典列表:

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

解决问题的关键

核心思想是将名称作为单个字典中的键。这样便于查找和更新。

希望这可以帮到你 :-)


如果L2中有L1中不存在的名称,这个会失败吗? - tzaman

1
假设名称是唯一的,您真的希望字典反过来(即从名称到角色),否则结构实际上没有意义。如果这样做,那么您就不需要在每个人员信息的列表中使用一个字典,而是可以使用一个字典来保存所有数据。
将您的列表转换为如下形式非常简单:
D1 = {name: role for record in L1 for (role, name) in record.items()}
D2 = {name: role for record in L2 for (role, name) in record.items()}

现在,您可以根据键轻松地将它们组合在一起:
for k, v in D2.items():
    D1[k] = D1.get(k, '') + v

Which gives you:

D1 = {'Tom Jones': 'D', 'Bob Jones': 'DP', 'Jim Jones': 'DP'}

我建议保留字典结构,因为它更易于使用,但如果需要,您也可以轻松将其转换回列表格式:
L3 = [{role: name} for name, role in D1.items()]

0

这个也可以:

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

L2 = [
    {'P': 'Jim Jones'},
    {'P': 'Bob Jones'}
]

l1={}
for i in L1:
    print(list(i.keys())[0],list(i.values())[0])
    l1[list(i.values())[0]]=list(i.keys())[0]

l2={}
for i in L2:
    print(list(i.keys())[0],list(i.values())[0])
    l2[list(i.values())[0]]=list(i.keys())[0]

l1l2={}
for i in set(l2).union(set(l)):
    l1l2[i] = l.get(i,"")+l2.get(i,"")
l1l2_list = [{value:key} for key,value in l1l2.items()]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接