小能豆

Python 中字典的深度合并

javascript

我需要合并多个词典,例如:

dict1 = {1:{"a":{"A"}}, 2:{"b":{"B"}}}

dict2 = {2:{"c":{"C"}}, 3:{"d":{"D"}}}

A B C树叶D,就像{"info1":"value", "info2":"value2"}

字典的级别(深度)未知,可能是{2:{"c":{"z":{"y":{C}}}}}

在我的例子中,它代表一个目录/文件结构,其中节点是文档,叶子是文件。

我想合并它们以获得:

 dict3 = {1:{"a":{"A"}}, 2:{"b":{"B"},"c":{"C"}}, 3:{"d":{"D"}}}

我不确定如何使用 Python 轻松地做到这一点。


阅读 41

收藏
2024-07-02

共1个答案

小能豆

要合并多个字典(每个字典代表类似于目录树的层次结构),可以使用函数递归合并它们。以下是使用 Python 解决此问题的方法:

复发

你可以定义一个递归函数来合并字典及其嵌套的

  1. 定义递归合并函数:
  2. 这个有趣的
  3. 处理叶节点:
  4. 合并时,如果两个字典都有叶节点(值不是字典本身),则可以决定如何处理冲突(例如,覆盖、连接等)。
  5. 合并嵌套结构:
  6. 如果两个字典中都存在一个键,并且它的值是一个字典,则递归合并这些字典。

您可以按照以下方式实现此目的:

def merge_dicts(dict1, dict2):
    merged = dict1.copy()

    for key, value in dict2.items():
        if key in merged:
            if isinstance(merged[key], dict) and isinstance(value, dict):
                merged[key] = merge_dicts(merged[key], value)
            elif isinstance(merged[key], set) and isinstance(value, set):
                merged[key].update(value)
            else:
                # Overwrite leaf nodes (non-dictionaries)
                merged[key] = value
        else:
            # Add new key-value pair
            merged[key] = value

    return merged

# Example dictionaries
dict1 = {1: {"a": {"A"}}, 2: {"b": {"B"}}}
dict2 = {2: {"c": {"C"}}, 3: {"d": {"D"}}}

# Merge dictionaries
dict3 = merge_dicts(dict1, dict2)
print(dict3)

解释:

  • merge_dicts 函数:

  • merge_dicts以两个字典(dict1dict2)作为输入。

  • 它初始化merged为的副本dict1以避免dict1修改。

  • 它遍历中的每个键值对dict2

  • 如果键存在于中

    merged

    ,它会检查值的类型:

    • 如果两个值都是字典(dict),它会递归地合并它们。
    • 如果两个值都是集合(set),则更新该集合。
    • 否则,它将merged用中的值覆盖中的值dict2
  • 如果 中不存在该键merged,它会将 中的键值对添加dict2merged

  • 最后,它返回合并后的字典。

  • 用法示例:

  • 该示例将dict1和合并dict2dict3

  • 它打印合并的词典,其中包含和的dict3组合层次结构。dict1``dict2

笔记:

  • 处理不同的叶节点类型:
  • 根据您的使用情况,您可能需要调整叶节点(非字典)的合并或覆盖方式。
  • 递归深度:
  • 这种方法可以递归处理未知深度的合并,以适应目录树等嵌套结构。

此方法提供了一种灵活、递归的方式来合并具有嵌套结构的字典,从而使您能够在 Python 中有效地管理分层数据。

2024-07-02