我有一本字典如下
{"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没有
答案 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']})])