合并两个DICT列表并更新密钥

2024-10-03 23:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个DICT列表,解释某人和他们的角色,例如,下面L1显示由D表示的驱动者的角色,L2显示由p表示的包装者的角色:

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

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

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

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

顺序无关紧要,这可以是一个新的列表,也可以在适当的地方完成


Tags: 角色l1列表顺序地方dictdpbob
3条回答

假设名称是唯一的,您真的希望字典走另一条路(即从名称到角色),因为否则结构就没有意义。如果您这样做,那么您就可以使用一个字典来保存所有数据,而不是每个人都有一个字典列表

这样转换列表非常简单:

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

这给了你:

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

我建议只保留字典结构,因为它更易于使用,但如果需要,也可以轻松地将其转换回列表格式:

L3 = [{role: name} for name, role in D1.items()]

这应该可以完成工作:

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

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

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

步骤3)将scratch字典重新转换为字典列表:

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

解决问题的关键

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

希望这有帮助:-)

这一条同样有效:

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()]

相关问题 更多 >