根据子字典中的值对字典进行排序

时间:2014-08-12 18:51:10

标签: python sorting dictionary

我有一本字典如下

{"SPORTS": {"data": [["Bball", "10", 3]], "columns": ["SPORT", "MATCHES", "WINS"]}, "GRAMMY": {"data": [["Billy Joel", "Rock", 1], ["Elton John", "FUnk", 2]], "columns": ["ARTIST", "GENRE", "ID"]}, "SONGS": {"data": [], "columns": ["NAME", "ARTIST", "SONG_ID"]}}

我想按照"数据"的大小对这本字典进行排序。清单。换句话说,上面我想要排序为

{"GRAMMY": {"data": [["Billy Joel", "Rock", 1], ["Elton John", "FUnk", 2]], "columns": ["ARTIST", "GENRE", "ID"]},"SPORTS": {"data": [["Bball", "10", 3]], "columns": ["SPORT", "MATCHES", "WINS"]}, "SONGS": {"data": [], "columns": ["NAME", "ARTIST", "SONG_ID"]}
}

格莱美表有2行,运动表有一行而SONGS没有

2 个答案:

答案 0 :(得分:2)

如果您不介意创建新词典,可以对键值对列表进行排序,然后将其添加到OrderedDict(在集合库中),它们会记住插入顺序。然后可以按照您想要的顺序转储为JSON对象。

d = {"SPORTS": {"data": [["Bball", "10", 3]], "columns": ["SPORT", "MATCHES", "WINS"]}, "GRAMMY": {"data": [["Billy Joel", "Rock", 1], ["Elton John", "FUnk", 2]], "columns": ["ARTIST", "GENRE", "ID"]}, "SONGS": {"data": [], "columns": ["NAME", "ARTIST", "SONG_ID"]}}
newd = OrderedDict(sorted(d.iteritems(), key=lambda x: len(x[1]['data']), reverse=True))
# change iteritems to items if python 3
# newd holds the sorted dictionaries

如果您使用JSON列表而不是对象,那么只需删除OrderedDict构造函数。

答案 1 :(得分:0)

您可以使用collections.OrderedDict执行此操作。

  

有序词典就像常规词典一样,但它们记住了项目的插入顺序。迭代有序字典时,项目按照其键首次添加的顺序返回。

因此,解决方案是将原始字典转换为键值对列表,对其进行排序,然后从结果列表中构造OrderedDict

>>> d = {"SPORTS": {"data": [["Bball", "10", 3]], "columns": ["SPORT", "MATCHES", "WINS"]}, "GRAMMY": {"data": [["Billy Joel", "Rock", 1], ["Elton John", "FUnk", 2]], "columns": ["ARTIST", "GENRE", "ID"]}, "SONGS": {"data": [], "columns": ["NAME", "ARTIST", "SONG_ID"]}}
>>> from collections import OrderedDict
>>> OrderedDict(sorted(d.items(), key=lambda (k, v): len(v["data"]), reverse=True))OrderedDict([('GRAMMY', {'data': [['Billy Joel', 'Rock', 1], ['Elton John', 'FUnk', 2]], 'columns': ['ARTIST', 'GENRE', 'ID']}), ('SPORTS', {'data': [['Bball', '10', 3]], 'columns': ['SPORT', 'MATCHES', 'WINS']}), ('SONGS', {'data': [], 'columns': ['NAME', 'ARTIST', 'SONG_ID']})])
OrderedDict([('GRAMMY', {'data': [['Billy Joel', 'Rock', 1], ['Elton John', 'FUnk', 2]], 'columns': ['ARTIST', 'GENRE', 'ID']}), ('SPORTS', {'data': [['Bball', '10', 3]], 'columns': ['SPORT', 'MATCHES', 'WINS']}), ('SONGS', {'data': [], 'columns': ['NAME', 'ARTIST', 'SONG_ID']})])