【问题标题】:Merge multiple same keys into one in the nested dictionary在嵌套字典中将多个相同的键合并为一个
【发布时间】:2020-01-14 17:59:33
【问题描述】:

我在列表中有一个嵌套字典,如下所示:

      my_list =

      [{'id': '166073',
        'ref': [{'MeSH': 'C548074'},
       {'UMLS': 'C1969084'},
       {'OMIM': '611523'},
       {'ICD-10': 'Q04.3'}]},

       {'id': '213',
       'ref': [{'MeSH': 'D003554'},
       {'UMLS': 'C0010690'},
       {'MedDRA': '10011777'},
       {'ICD-10': 'E72.0'},
       {'OMIM': '219750'},
       {'OMIM': '219800'},
       {'OMIM': '219900'}]},

       {'id': '333',
        'ref': [{'UMLS': 'C2936785'},
       {'ICD-10': 'E75.2'},
       {'MeSH': 'C537075'},
       {'MeSH': 'D055577'},
       {'UMLS': 'C0268255'},
       {'OMIM': '228000'}]}
         .
         .
         .               
                         ]

我想将嵌套字典中具有相同键的字典合并为键中的列表,如下所示:

    my_list =

    [{'id': '166073',
      'ref': [{'MeSH': 'C548074'},
       {'UMLS': 'C1969084'},
       {'OMIM': '611523'},
       {'ICD-10': 'Q04.3'}]},

     {'id': '213',
      'ref': [{'MeSH': 'D003554'},
       {'UMLS': 'C0010690'},
       {'MedDRA': '10011777'},
       {'ICD-10': 'E72.0'},
       {'OMIM': ['219750', '219800', '219900']}]},

     {'id': '333',
      'ref': [{'UMLS': 'C2936785'},
       {'ICD-10': 'E75.2'},
       {'MeSH': ['C537075', 'D055577']},
       {'UMLS': 'C0268255'},
       {'OMIM': '228000'}]}
         .
         .
         .               
                         ]

我尝试通过使用双for循环读取字典并将信息存储到另一个新字典来进行合并,但我发现该方法不是最佳的,有没有其他推荐的方法来完成这种合并?谢谢!

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    为什么它不是最理想的? 我认为这种合并应该没问题。 我假设你的合并是这样的:

    my_list = [{'id': '166073',
            'ref': [{'MeSH': 'C548074'},
           {'UMLS': 'C1969084'},
           {'OMIM': '611523'},
           {'ICD-10': 'Q04.3'}]},
    
           {'id': '213',
           'ref': [{'MeSH': 'D003554'},
           {'UMLS': 'C0010690'},
           {'MedDRA': '10011777'},
           {'ICD-10': 'E72.0'},
           {'OMIM': '219750'},
           {'OMIM': '219800'},
           {'OMIM': '219900'}]},
    
           {'id': '333',
            'ref': [{'UMLS': 'C2936785'},
           {'ICD-10': 'E75.2'},
           {'MeSH': 'C537075'},
           {'MeSH': 'D055577'},
           {'UMLS': 'C0268255'},
           {'OMIM': '228000'}]}]
    
    def merge(item):
      from collections import defaultdict
      merged = defaultdict(list)
      for ref in item.get('ref', []):
        for key, val in ref.items():
          merged[key].append(val)
      return {**item, 'ref': dict(merged)}
    
    print(list(map(merge, my_list)))
    

    【讨论】:

      【解决方案2】:
      #!/usr/bin/env python                                                                                                                                                                                                                                                       
      
      o = {'id': '213',
           'ref': [{'MeSH': 'D003554'},
                   {'UMLS': 'C0010690'},
                   {'MedDRA': '10011777'},
                   {'ICD-10': 'E72.0'},
                   {'OMIM': '219750'},
                   {'OMIM': '219800'},
                   {'OMIM': '219900'}]}
      
      n = {'id': o['id'],
           'ref': {x:[] for x in set([item for sublist in o['ref'] for item in sublist])}}
      
      for p in o['ref']:
          for k, v in p.items():
              n['ref'][k].append(v)
      
      n['ref'] = [n['ref']]
      
      print(n)
      

      【讨论】:

        【解决方案3】:

        我发现创建一个字典来收集值比解压成所需的格式更容易:

        new_list = []
        
        for item in my_list:
            d = {'id': item['id'], 'ref': {}}
            for r in item['ref']:
                only_key = list(r.keys())[0]
                d['ref'][only_key] = d['ref'].get(only_key, []) + [r[only_key]]
            new_list.append(d)
        
            new_ref = []
            for k, v in d['ref'].items():
                new_ref.append({k: v if len(v) > 1 else v[0]})
            d['ref'] = new_ref
        
        
        
        [{'id': '166073', 'ref': [{'OMIM': '611523'}, {'MeSH': 'C548074'}, {'ICD-10': 'Q04.3'}, {'UMLS': 'C1969084'}]},
         {'id': '213', 'ref': [{'MeSH': 'D003554'}, {'UMLS': 'C0010690'}, {'MedDRA': '10011777'}, {'ICD-10': 'E72.0'}, {'OMIM': ['219750', '219800', '219900']}]},
         {'id': '333', 'ref': [{'ICD-10': 'E75.2'}, {'OMIM': '228000'}, {'MeSH': ['C537075', 'D055577']}, {'UMLS': ['C2936785', 'C0268255']}]}]
        

        【讨论】:

          【解决方案4】:

          使用python的列表推导:

          def merge(item):
            from collections import defaultdict
            merged = defaultdict(list)
          
            [[merged[k].append(v) for k, v in ref.items()] for ref in item.get('ref', [])]
          
            return {**item, 'ref': dict(merged)}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-31
            • 2019-09-18
            • 2023-03-07
            • 2019-03-23
            • 2020-07-29
            相关资源
            最近更新 更多