【问题标题】:Merge multiple dictionaries within a list by primary key按主键合并列表中的多个字典
【发布时间】:2021-08-30 14:04:12
【问题描述】:

以下问题:

我有一个list 的字典,例如:

l = [{"primary_key": 5164, "attribute1": 2},
     {"primary_key": 5162, "attribute1": 3}, 
     {"primary_key": 5164, "attribute2": 3}] 

我想将它们加入一个输出列表,但合并具有相同主键的字典:

output_l = [{"primary_key": 5164, "attribute1": 2, "attribute2": 3},
            {"primary_key": 5162, "attribute1": 3}]

经过大量搜索,我没有在其他地方找到这个问题。对不起,如果它是重复的。它与this question 非常相关,但只有一个列表而不是多个列表。

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    创建一个字典,您可以在其中按主键存储不断增长的字典。以下将起作用:

    dicts = {}
    for dct in l:
        dicts.setdefault(dct["primary_key"], {}).update(dct)
    
    l = [*dicts.values()]
    # [{'primary_key': 5164, 'attribute1': 2, 'attribute2': 3},
    #  {'primary_key': 5162, 'attribute1': 3}]
    

    注意共享属性名,最新的条目会“赢”。

    【讨论】:

      【解决方案2】:

      这是另一种方法:

      l = [{"primary_key": 5164, "attribute1": 2},
           {"primary_key": 5162, "attribute1": 3}, 
           {"primary_key": 5164, "attribute2": 3},
           {"primary_key": 5162, "attribute2": 3},
           {"primary_key": 5163, "attribute1": 4}] 
      
      # Final list
      out_list = []
      
      # Dict to maintain the position where particular primary key was inserted in out_list
      visited_keys = {}
      index = 0
      for item in l:
          # If this key is already in out_list, update it with new key:value
          if item['primary_key'] in visited_keys.keys():
              out_list[visited_keys[item["primary_key"]]].update(item)
          else:
              # Key is not visited, so just append it to the out_list
              out_list.append(item)
              visited_keys[item["primary_key"]] = index
              index += 1
              
      print (out_list)
      

      输出:

      [{'primary_key': 5164, 'attribute1': 2, 'attribute2': 3}, {'primary_key': 5162, 'attribute1': 3, 'attribute2': 3}, {'primary_key': 5163, 'attribute1': 4}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-04
        • 2021-01-10
        • 1970-01-01
        • 2022-12-18
        • 2021-05-09
        • 2019-03-12
        相关资源
        最近更新 更多