2016-11-29 2 views
0

Ich muss Zeile für Zeile eine statische JSON-Datei drucken. Ich möchte dies vor dem Drucken nach einem Schlüsselwert sortieren. Ich habe mir einige andere Beispiele für stackoverflow angeschaut, konnte aber keine Lösung für dieses Problem finden.Wie sortierte Daten auf json.load gedruckt werden?

Mein Code so sieht weit wie folgt aus:

import json 
from pprint import pprint 
with open('items.json') as data_file: 
    data = json.load(data_file) 
    for line in data: 
     pprint(data) 

Mein json sieht wie folgt aus:

[ 
{"version": ["2.8.2"], "license": ["GPL"]}, 
{"version": ["1.8.8"], "license": ["MIT/X11 License"]}, 
{"version": ["2.8.5"], "license": ["GPL"]}, 
{"version": ["1.8.9"], "license": ["MIT/X11 License"]} 
] 

Wie kann ich es durch einen Schlüsselwert wie "Version" sortieren, während um die Erhaltung? Auf diese Weise kann ich feststellen, bei welcher Version die Lizenz geändert wurde.

gewünschte Ausgabe würde wie folgt aussehen:

[ 
{"version": ["1.8.8"], "license": ["MIT/X11 License"]}, 
{"version": ["1.8.9"], "license": ["MIT/X11 License"]}, 
{"version": ["2.8.2"], "license": ["GPL"]}, 
{"version": ["2.8.5"], "license": ["GPL"]} 
] 

Danke.

+0

'für Zeile in Daten: pprint (Daten)' wird nie Ihre gewünschte Ausgabe geben, so dass ich zu klären, sind Sie gültige JSON zu erhalten suchen als die Ausgabe, oder willst du nur etwas sortiert und schön? –

+0

In diesem Fall einfach sortiert und hübsch. – tonemgub

Antwort

0

Es sieht aus wie die Daten bereits in Wörterbuchform so etwas wie:

sorted_data = sorted(data, key = lambda x: x['version']) 

Und dann Pretty-Print, die Struktur.

Edit: Sie die gesamte Struktur mit einer Zeile drucken kann, nebenbei gesagt:

pprint.pprint(sorted_data, indent=4) 

sollte ziemlich gut aussehen.

Weitere Informationen über den Lambda-Ausdruck, haben einen Blick auf diesen SO thread: What is key=lambda

+0

Ja, das macht genau das, was ich wollte. Ich werde mehr über die Lamda-Funktion erfahren. Danke für Ihre Hilfe! – tonemgub

+0

@tonemgub Gut zu helfen! Ich habe einen Link zu einer guten Zusammenfassung von Lambda hinzugefügt. Vergessen Sie nicht, die Antwort zu akzeptieren, die Ihnen am besten gefällt (ich sehe dort eine andere, die auch gut ist) – Andrew

1

Sie müssen nur Ihre Liste von dicts mit einer entsprechenden Schlüsselfunktion sortieren. Sie könnte ein Lambda verwenden, aber itemgetter ist effizienter.

import json 
from pprint import pprint 
from operator import itemgetter 

data_str = '''\ 
[ 
    {"version": ["2.8.2"], "license": ["GPL"]}, 
    {"version": ["1.8.8"], "license": ["MIT/X11 License"]}, 
    {"version": ["2.8.5"], "license": ["GPL"]}, 
    {"version": ["1.8.9"], "license": ["MIT/X11 License"]} 
] 
''' 

data = json.loads(data_str) 
data.sort(key=itemgetter("version")) 
pprint(data) 

Ausgang

[ {'license': ['MIT/X11 License'], 'version': ['1.8.8']}, 
    {'license': ['MIT/X11 License'], 'version': ['1.8.9']}, 
    {'license': ['GPL'], 'version': ['2.8.2']}, 
    {'license': ['GPL'], 'version': ['2.8.5']}] 
+0

Vielen Dank, dass Sie Ihre Lösung anbieten! Ich habe es nicht mit einem großen Datensatz zu tun, aber ich nehme mit Effizienz an, dass itemgetter schneller ist als Lambda. – tonemgub

+0

@tonemgub Ja, 'itemgetter' ist schneller als ein äquivalentes Lambda, aber es ist gut, beide Wege zu kennen, denn manchmal braucht man eine Schlüsselfunktion, die mehr leistet als" itemgetter ". –

Verwandte Themen