簡體   English   中英

如何在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'}]

非常感謝您對我的幫助。

  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]

我將提供較少的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM