【问题标题】:How to sort data in the dictionary of list of dictionary in python?如何对python中字典列表的字典中的数据进行排序?
【发布时间】:2018-05-08 05:48:36
【问题描述】:

请帮助我。我有这样的数据集:

 my_dict = { 'project_1' : [{'commit_number':'14','name':'john'},
                            {'commit_number':'10','name':'steve'}],
             'project_2' : [{'commit_number':'12','name':'jack'},
                            {'commit_number':'15','name':'anna'},
                            {'commit_number':'11','name':'andy'}]
           }

我需要根据提交号按降序对数据集进行排序,并通过忽略使用python的项目名称将其放入新列表中。预期的列表将是这样的:

ordered_list_of_dict = [{'commit_number':'15','name':'anna'},
                        {'commit_number':'14','name':'john'},
                        {'commit_number':'12','name':'jack'},
                        {'commit_number':'11','name':'andy'},
                        {'commit_number':'10','name':'steve'}]

非常感谢你帮助我。

【问题讨论】:

    标签: python list dictionary ordereddictionary


    【解决方案1】:
    1. 提取my_dict 的值作为列表列表*
    2. 将每个子列表连接在一起(扁平化dict_values)以形成扁平化列表
    3. commit_number对每个元素进行排序

    *python2 上的列表列表。在 python3 上,返回一个 dict_values 对象。

    from itertools import chain
    
    res = sorted(chain.from_iterable(my_dict.values()), 
                 key=lambda x: x['commit_number'], 
                 reverse=True)
    
    [{'commit_number': '15', 'name': 'anna'},
     {'commit_number': '14', 'name': 'john'},
     {'commit_number': '12', 'name': 'jack'},
     {'commit_number': '11', 'name': 'andy'},
     {'commit_number': '10', 'name': 'steve'}]
    

    在 python2 上,您可以使用 dict.itervalues 而不是 dict.values 达到相同的效果。

    【讨论】:

      【解决方案2】:

      Coldspeed 的回答和往常一样棒,但作为替代方案,您可以使用以下方法:

      ordered_list_of_dict = sorted([x for y in my_dict.values() for x in y], key=lambda x: x['commit_number'], reverse=True)
      

      在打印时给出:

      print(ordered_list_of_dict)
      # [{'commit_number': '15', 'name': 'anna'}, {'commit_number': '14', 'name': 'john'}, {'commit_number': '12', 'name': 'jack'}, {'commit_number': '11', 'name': 'andy'}, {'commit_number': '10', 'name': 'steve'}]
      

      请注意,在list-comprehension 中,您有用于展平列表列表 的标准构造:

      [x for sublist in big_list for x in sublist]

      【讨论】:

        【解决方案3】:

        我将提供更少 Python 且更易于阅读的答案。

        首先,遍历 my_dict 中的键值对,并将 value 的每个元素添加到一个空列表中。这样您就不必将列表列表弄平:

        commits = []
        for key, val in my_dict.items():
            for commit in val:
                commits.append(commit)
        

        这给出了这个:

        In [121]: commits
        Out[121]: 
        [{'commit_number': '12', 'name': 'jack'},
         {'commit_number': '15', 'name': 'anna'},
         {'commit_number': '11', 'name': 'andy'},
         {'commit_number': '14', 'name': 'john'},
         {'commit_number': '10', 'name': 'steve'}]
        

        然后按降序排序:

        sorted(commits, reverse = True)
        

        即使您没有指定它,它也会根据 'commit_number' 排序,因为它按字母顺序排列在 'name' 之前。如果您想为defensive coding 指定它,据我所知,这将是最快和最干净的方式:

        from operator import itemgetter
        sorted(commits, key = itemgetter('commit_number'), reverse = True)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-19
          • 2018-09-27
          • 1970-01-01
          • 2014-03-13
          • 2014-11-10
          • 1970-01-01
          • 2015-05-29
          • 1970-01-01
          相关资源
          最近更新 更多