【问题标题】:Python: Merge Values into List for Unique KeyPython:将值合并到唯一键的列表中
【发布时间】:2019-11-12 08:41:37
【问题描述】:

我有一个字典列表,其中包含字典的键和值:

Array = [
    {'Example1': {'Time Taken': 56, 'Type': 'Quiz'} },
    {'Example1': {'Time Taken': 58, 'Type': 'Exam'} },
    {'Example2': {'Time Taken': 40, 'Type': 'Quiz'} } ]

我想遍历列表并仅获取唯一键,并将值合并到一个列表中:

{ 'Example1': [
    { 'Time Taken': 56, 'Type': 'Quiz' },
    { 'Time Taken': 58, 'Type': 'Exam' } ] }

{ 'Example2': [ { 'Time Taken': 40, 'Type': 'Quiz' } ] }

知道如何解决这个问题吗?我尝试了很多不同的东西,但似乎无法找到一种有效的方法来编写这段代码。任何反馈表示赞赏。

【问题讨论】:

    标签: python list dictionary merge


    【解决方案1】:

    我在没有任何外部模块的情况下创建了以下内容

    Array = [{'Example1': {'Time Taken': 56, 'Type': 'Quiz'} }, 
             {'Example1': {'Time Taken': 58, 'Type': 'Exam'} }, 
             {'Example2': {'Time Taken': 40, 'Type': 'Quiz'} }]
    
    result = {}
    for i in range(len(Array)):
        dict = Array[i]
        for key in dict :
            if key in result:
                result[key].append(dict[key]) 
            else:
                result[key]=[dict[key]]
    
    print(result)
    

    输出:

    {
     'Example1': [{'Time Taken': 56, 'Type': 'Quiz'},
                  {'Time Taken': 58, 'Type': 'Exam'}],
     'Example2': [{'Time Taken': 40, 'Type': 'Quiz'}]
    }
    

    【讨论】:

      【解决方案2】:

      尝试关注。

      from collections import defaultdict
      # l is list of dictionaries
      d = defaultdict(list)
      for x in l:
          for y in x:
              d[y].append(x[y])
      print(d)
      

      【讨论】:

        【解决方案3】:

        如果缺少键,您可以遍历字典并使用dict.setdefault 将默认设置为空列表,否则附加到列表:

        for dct in Array: 
            for k, v in dct.items(): 
                out.setdefault(k, []).append(v) 
        

        out 是所需的输出dict

        示例:

        In [1208]: arr = [ {'Example1': {'Time Taken': 56, 'Type': 'Quiz'} }, {'Example1': {'Time Taken': 58, 'Type': 'Exam'} }, {'Example2': {'Time Taken': 40, 'Type': 'Quiz'} } ]                                
        
        In [1209]: out = {}                                                                                                                                                                                         
        
        In [1210]: for dct in arr: 
              ...:     for k, v in dct.items(): 
              ...:         out.setdefault(k, []).append(v) 
              ...:                                                                                                                                                                                                  
        
        In [1211]: out                                                                                                                                                                                              
        Out[1211]: 
        {'Example1': [{'Time Taken': 56, 'Type': 'Quiz'},
          {'Time Taken': 58, 'Type': 'Exam'}],
         'Example2': [{'Time Taken': 40, 'Type': 'Quiz'}]}
        

        【讨论】:

          【解决方案4】:

          使用collections.defaultdict

          例如:

          from collections import defaultdict
          
          Array = [ {"Example1": {"Time Taken": 56, "Type": "Quiz"} }, {"Example1": {"Time Taken": 58, "Type": "Exam"} }, {"Example2": {"Time Taken": 40, "Type": "Quiz"} } ]
          result = defaultdict(list)
          for ar in Array:                 #Iterate each element in list
              for k, v in ar.items():      #Iterate your dict
                  result[k].append(v)      #Create key-list.
          print(result)
          

          输出:

          defaultdict(<class 'list'>, {'Example1': [{'Time Taken': 56, 'Type': 'Quiz'}, {'Time Taken': 58, 'Type': 'Exam'}], 'Example2': [{'Time Taken': 40, 'Type': 'Quiz'}]})
          

          【讨论】:

          • 这很有帮助!如果我想将 'Example1' 和 'Example2' 放入两个字典中,并使用它们各自的列表值,我可以遍历数组 'result' 吗?
          • 是的,你可以。但我不明白这一点。您已经在字典中有数据
          猜你喜欢
          • 2013-03-26
          • 1970-01-01
          • 1970-01-01
          • 2021-04-17
          • 2012-01-15
          • 1970-01-01
          • 1970-01-01
          • 2022-08-02
          • 1970-01-01
          相关资源
          最近更新 更多