Arrayfriendly字典merg

2024-06-11 09:02:06 发布

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

我有两个字典的格式如下:

d1 = { "root" : { "leaf" : [diff1, diff2] }}

d2 = { "root" : { "leaf": [diff3], "node": { "leaf" : [diff1] } } }

我希望能够将它们组合成这样一个结果:

d3 = {'root': {'leaf': ['diff1', 'diff2', 'diff 3'], 'node': {'leaf': ['diff 1']}}}

对于任何给定的输入,递归的级别都是未定义的,但是每个“叶节点”都将是一个数组,如果每个字典中的叶节点都有一个数组,那么我将合并这个数组。注意:这些键实际上不是“node”和“leaf”,我只是用这些键来帮助说明示例

这段代码似乎用第二段代码完全覆盖了我的数组: d3 = {**d1, **d2}产生 result = {'root': {'leaf': ['diff 3'], 'node': {'leaf': ['diff 1']}}}


Tags: 代码node字典节点格式diffroot数组
2条回答

您可以使用递归函数来实现这一点。注意,这只会合并列表,而不会合并元组或任何其他类型的序列:

def merge_dicts(d1, d2):
    out_dict = {}
    for key in (set(d1.keys()) | set(d2.keys())):
        if key in d1 and key in d2:
            if isinstance(d1[key], dict) and isinstance(d2[key], dict):
                out_dict[key] = merge_dicts(d1[key], d2[key])
            elif isinstance(d1[key], list) and isinstance(d2[key], list):
                out_dict[key] = d1[key] + d2[key]
            elif d1[key] == d2[key]:
                out_dict[key] = d1[key]
            else:
                raise ValueError(
                    'Cannot merge conflicting values {} and {}'.format(
                        d1[key], d2[key]))
        elif key in d1:
            out_dict[key] = d1[key]
        else:
            out_dict[key] = d2[key]
    return out_dict

d1 = { "root" : { "leaf" : ['diff1', 'diff2'] }}
d2 = { "root" : { "leaf": ['diff3'], "node": { "leaf" : ['diff1'] } } }

print(merge_dicts(d1, d2))

如果调用merge_dicts({'key': 'value'}, {'key': 'different_value'}),您还没有定义要做什么。我让它引发了一个ValueError,因为我认为您不能合并这两个dict(您将使用哪个值?),但是如果您想从其中一个dict中选择值作为默认值,您可以更改它

未经测试,但类似的方法应该有效:

def dictmerge(d1, d2):
    if d1 is None:
        return d2
    if d2 is None:
        return d1
    if isinstance(d1, list) and isinstance(d2, list):
        return d1+d2
    if isinstance(d1, dict) and isinstance(d2, dict):
        return {k: dictmerge(d1.get(k), d2.get(k))
            for k in set(d1.keys()) | set(d2.keys())}
    raise ValueError, "inputs have incompatible structure"

相关问题 更多 >