[英]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]
我將提供較少的Python語言和更易於閱讀的答案。
首先,迭代my_dict中的鍵值對,然后將值的每個元素添加到空列表中。 通過這種方式,您不必拼合列表列表:
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”之前。 如果您想為防御性編碼指定它,就我所知,這將是最快,最簡潔的方法:
from operator import itemgetter
sorted(commits, key = itemgetter('commit_number'), reverse = True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.