使用1个dict作为基础合并Python中的dict

时间:2017-07-28 13:16:35

标签: python dictionary nested

我正在寻找有关我的Python代码的反馈。我想合并两个词典。其中一个字典控制结构和默认值,第二个字典将在适用时覆盖默认值。

请注意,我正在寻找以下行为:

  • 只有
  • 才会出现在其他词典中的密钥
  • 应该考虑嵌套的词汇

我写了这个简单的函数:

def merge_dicts(base_dict, other_dict):
    """ Merge two dicts

    Ensure that the base_dict remains as is and overwrite info from other_dict
    """
    out_dict = dict()
    for key, value in base_dict.items():
        if key not in other_dict:
            # simply use the base
            nvalue = value
        elif isinstance(other_dict[key], type(value)):
            if isinstance(value, type({})):
                # a new dict myst be recursively merged
                nvalue = merge_dicts(value, other_dict[key])
            else:
                # use the others' value
                nvalue = other_dict[key]
        else:
            # error due to difference of type
            raise TypeError('The type of key {} should be {} (currently is {})'.format(
                key,
                type(value),
                type(other_dict[key]))
            )
        out_dict[key] = nvalue
    return out_dict

我相信这可以做得更漂亮/ pythonic。

3 个答案:

答案 0 :(得分:1)

如果您使用的是python 3.5或更高版本,则可以执行以下操作:

$("#myForm").submit(function(e){
    e.preventDefault();
    $.ajax({
        url:'/admin/projects/postUpload',
        type:'post',
        data:$('#myForm').serializeArray(),
        success: function(){
            $("#form1").fadeOut(1000);
            $("#form2").fadeIn(1000);
        }
    });
});

如果您使用的是任何先前版本,则可以使用merged_dict = {**base_dict, **other_dict} 方法执行此操作:

update

有关它的更多信息,您可以查看The Idiomatic Way to Merge Dictionaries in Python

答案 1 :(得分:1)

“Pythonicness”是一个很难评估的方法,但这是我的看法:


<artifactId>spark-testing-base_2.11</artifactId>
<artifactId>spark-core_2.10</artifactId>

示例:

def merge_dicts(base_dict, other_dict):
    """ Merge two dicts

    Ensure that the base_dict remains as is and overwrite info from other_dict
    """
    if other_dict is None:
        return base_dict
    t = type(base_dict)
    if type(other_dict) != t:
        raise TypeError("Mismatching types: {} and {}."
                        .format(t, type(other_dict)))
    if not issubclass(t, dict):
        return other_dict
    return {k: merge_dicts(v, other_dict.get(k)) for k, v in base_dict.items()}

答案 2 :(得分:0)

您可以使用dict.update方法以及生成器表达式:

base_dict.update((k, v) for k, v in other_dict.items() if k in base_dict)

<强>解释

base_dict.update(other_dict)会使用base_dict中的值覆盖other_dict中的值。 如果other_dict中存在密钥但base_dict中没有密钥,则会将其添加到base_dict,这不是您想要的。 因此,您需要测试other_dict中的每个密钥是否都在base_dict

dict.update可以将iterable作为第一个参数。如果后者包含2个元组(k, v),那么base_dict[k]将设置为v

摘自help(dict.update)

  

builtins.dict实例的更新(...)方法

     

如果E存在且缺少.keys()方法,那么:对于k,v在E中:D [k] = v

因此,将生成器表达式传递给它是很方便的。 如果您不熟悉生成器表达式,则括号内的内容或多或少等同于以下内容:

l = []
for k, v in other.dict_items():
    if k in base_dict:
        l.append((k, v))

然后l传递给update,例如base_dict.update(l)