Mam następujący słownik

{"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"]}}

Chcę posortować ten słownik według rozmiaru listy "Data". Innymi słowy powyższe, chcę posortować jak

{"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"]}
}

Gdzie tabela Grammy ma 2 rzędy, stół sportowy ma jeden wiersz, a piosenki nie mają

0
sarath joseph 12 sierpień 2014, 22:51

2 odpowiedzi

Najlepsza odpowiedź

Jeśli nie masz nic przeciwko utworzeniu nowego słownika, możesz sortować listę par kluczowych par, a następnie dodać te do zamówionejdict (w bibliotece kolekcji), które pamięta kolejność wstawiania. Następnie można go porzucić jako obiekt JSON w żądanej kolejności.

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

Jeśli dobrze jesteś w porządku z listą JSON zamiast obiektu, po prostu usuń konstruktor zamówienia.

2
dsemi 12 sierpień 2014, 19:05

Możesz użyć {x0}}, aby to zrobić.

Zamówione słowniki są jak zwykłe słowniki, ale pamiętają o kolejności, które wprowadzono przedmioty. Podczas iteracji nad zamówionym słownikiem, przedmioty są zwracane w kolejności pierwszego dodania kluczy.

Tak więc rozwiązaniem jest przekształcenie oryginalnego dict w listę par wartości kluczy, zamów go, a następnie skonstruuj OrderedDict z uzyskanej listy.

>>> 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']})])
0
Sergei Lebedev 12 sierpień 2014, 19:00