我有两份字典,解释了某人及其角色,例如,在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'}
]
顺序无关紧要,这可以是新列表,也可以就地完成
答案 0 :(得分: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'}
步骤2)循环遍历 L2 中的名称,然后在 scratch 中查找名称并更新其值。
scratch['Jim Jones'] += 'P'
步骤3)将草稿字典重新变成字典列表:
result = [{'DP': 'Jim Jones'}, {'D': 'Tom Jones'}, {'DP': 'Bob Jones'}]
解决问题的关键
核心思想是名称应该是单个字典中的键。这样可以轻松进行查找和更新。
希望这会有所帮助:-)
答案 1 :(得分:1)
假设名称是唯一的,则您确实希望字典采用另一种方式(即从名称到角色),因为否则结构实际上就没有意义。如果这样做的话,则可以只使用 one 词典来保存所有数据,而不是每个词典都只有一个人。
像这样转换列表很简单:
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()]
答案 2 :(得分: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()]