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

时间:2020-01-28 18:26:39

标签: python list dictionary

我有两份字典,解释了某人及其角色,例如,在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 个答案:

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