繁体   English   中英

根据匹配的键值对组合字典列表中的字典

[英]combine dictionaries in list of dictionaries based on matching key:value pair

我想在具有匹配键:值对的字典列表中组合/合并多个字典。 但是,我不希望这些对中的“值”本身成为每个新形成的字典中的列表。 每个字典都有相同的键集,但除了我想要组合的键值对之外,大多数键值对都是唯一的。 我知道我可以根据匹配键组合字典,例如在这个例子中:

>>>from collections import defaultdict
d1 = {'A': 'str1', 'B': 41, 'C': 32}
d2 = {'A': 'str1', 'B': 12, 'C': 62}
d3 = {'A': 'str2', 'B': 47, 'C': 73}
d4 = {'A': 'str2', 'B': 101, 'C': 93}

dd = defaultdict(list)

for d in [d1, d2, d3, d4]: # you can list as many input dicts as you want here, I'll have a few thousand
    for key, value in d.items():
        dd[key].append(value)

print(dd)

这给了我预期的结果:

defaultdict(<class 'list'>, {'A': ['str1', 'str1', 'str2', 'str2'],
                             'B': [41, 12, 47, 101],
                             'C': [32, 62, 73, 93]})

当我想要的结果实际上是这样的:

[{'A': 'str1', 'B': [41, 12], 'C': [32, 62]}, 
 {'A': 'str2', 'B': [47, 101], 'C': [73, 93]}]

例如,匹配键'B''C'形成列表,仅当键'A'下存在匹配的键:值对时才组合字典,而不在'A'形成相同值的列表

您可以执行以下操作:

from collections import defaultdict
from functools import reduce
from itertools import chain


 def merge(d1, d2, key='A'):
    r = defaultdict(list)

    for k, v in chain(d1.items(), d2.items()):
        if k != key:
            r[k].extend(v if isinstance(v, list) else [v])

    return {**r, key: d1[key]}


d1 = {'A': 'str1', 'B': 41, 'C': 32}
d2 = {'A': 'str1', 'B': 12, 'C': 62}
d3 = {'A': 'str2', 'B': 47, 'C': 73}
d4 = {'A': 'str2', 'B': 101, 'C': 93}

common = defaultdict(list)
for d in [d1, d2, d3, d4]:
    common[d['A']].append(d)

result = [reduce(merge, value) for value in common.values()]

print(result)

输出

[{'B': [41, 12], 'C': [32, 62], 'A': 'str1'}, {'B': [47, 101], 'C': [73, 93], 'A': 'str2'}]
dd2=[]
for d in [d1,d2,d3,d4]:
    found=False
    for dtmp in dd2:        
        if dtmp['A'] == d['A']:
            dtmp['B'].append(d['B'])
            dtmp['C'].append(d['C'])
            found=True
    if not found:
        dtmp2={'A':d['A'],'B':[d['B']],'C':[d['C']]}
        dd2.append(dtmp2)

dd2 将是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM