如何在python中对字典列表的字典中的数据进行排序?

2024-04-27 01:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

 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'}]

非常感谢你帮助我。你知道吗


Tags: 数据nameprojectnumber列表myjohndict
3条回答

我将提供一个不那么恶作剧和更读者友好的答案。你知道吗

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

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\u number”进行排序,即使您没有指定它,因为它按字母顺序排在“name”之前。如果您想为了defensive coding而指定它,据我所知,这将是最快和最干净的方法:

from operator import itemgetter
sorted(commits, key = itemgetter('commit_number'), reverse = True)
  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达到相同的效果。你知道吗

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]

相关问题 更多 >