代码之家  ›  专栏  ›  技术社区  ›  Lyapunov1729

如何按项目连接字典

  •  -1
  • Lyapunov1729  · 技术社区  · 1 年前

    假设我有两本结构相同的词典(先验未知):

    dict1 = {"num": {"a": 1, "b": 2}, "fruit": "banana"}
    dict2 = {"num": {"a": 3, "b": 4}, "fruit": "apple"}
    

    我怎样才能把一系列这样的词典合并成一个字典,比如

    merged_dict = {"num": {"a": [1, 3], "b": [2, 4]}, "fruit": ["banana", "apple"]}
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Grismar    1 年前

    你没有提供很多背景,所以必须做出假设:

    • 你提到了一个列表,所以可能有两本以上的词典
    • 您提供了两个结构相同的词典,因此我们可以假设这是所有词典的规则

    在这些假设下,解决方案非常简单:

    dict1 = {"num": {"a": 1, "b": 2}, "fruit": "banana"}
    dict2 = {"num": {"a": 3, "b": 4}, "fruit": "apple"}
    
    
    def merge_dicts(ds: list[dict]) -> dict:
        return {
            k: (
                merge_dicts([d[k] for d in ds]) if isinstance(v, dict)
                else [d[k] for d in ds]
            ) for k, v in ds[0].items()
        }
    
    
    merged_dict = merge_dicts([dict1, dict2])
    print(merged_dict)
    

    注: for k, v in ds[0].items() 只循环列表中第一个字典的项目,因为假设所有字典的结构都是相同的(当涉及到字典值与其他类型时),并且具有相同的键。

    输出:

    {'num': {'a': [1, 3], 'b': [2, 4]}, 'fruit': ['banana', 'apple']}