如何对 python 中字典列表的字典中的数据进行排序?
How to sort data in the dictionary of list of dictionary in 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'}]
非常感谢你帮助我。
- 将
my_dict
的值提取为列表列表*
- 将每个子列表连接在一起(展平
dict_values
)以形成平面列表
- 按
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]
我将提供更少 pythonic 和更多 reader 友好的答案。
首先,遍历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)
请帮帮我。我有这样的数据集:
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'}]
非常感谢你帮助我。
- 将
my_dict
的值提取为列表列表* - 将每个子列表连接在一起(展平
dict_values
)以形成平面列表 - 按
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]
我将提供更少 pythonic 和更多 reader 友好的答案。
首先,遍历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)