2016-11-08 1 views
-1

Ich habe eine JSON-Datei mit Buchinformationen. In der Originaldatei gibt es mehr.Sortieren Wert aus einer JSON-Datei mit str.split

Beispiel:

 [{"author": "Wes McKinney", "price": 53, "title": "Python for Data  Analysis", "publication_year": "2012", "topic": "programming"}, 
     {"author": "Joel Grus", "price": 66, "title": "Data Science from Scratch", "publication_year": "2015", "topic": "Python"}] 

Nun möchte Ich mag die Informationen sortieren, basierend auf dem Nachnamen des Autors. tat ich folgendes:

names = [] 
for a in jsondata: 
names.append(str.split((a['author']))) 

print (sorted(names)) 

i erhalten dann Informationen wie folgt aus:

[['Allan', 'Downey'], ['Allan', 'Downey'] 

ich mich gefragt, ob mir jemand einen Tip/Tipp geben könnte, was, wie man verwende ich alle Informationen sortieren basierend auf den Nachnamen des Autors.

Antwort

0

Try this:

names = [] 
for a in jsondata: 
    last_name = a["author"].split(" ")[1] 
    names.append(last_name) 

print(sorted(names)) 

Wenn Sie möchten, sortierte Wörterbücher bekommen, können Sie es wie folgt tun:

for a in sorted(jsondata, key=lambda x: x["author"].split(" ")[1]): 
    # You can use dict any way you like. E.g.: 
    print(a["title"] + " " + str(a["price"])) 
+0

Do oder nicht. Es gibt kein "Versuch". Eine *** gute Antwort *** wird immer eine Erklärung haben, was getan wurde und warum es so gemacht wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO. –

1

Sie können Ihre JSON Struktur sortieren mit sorted() mit lambda Ausdruck als:

lambda x: x["author"].split()[-1] 
# split value of "author", key and sort based on the last word 

Es besteht keine Notwendigkeit, explizit iter über die Liste und erstellen Sie eine weitere Liste, um die Namen zu verwalten.

Probelauf:

>>> my_json = [ 
     {"author": "Wes McKinney", "price": 53, "title": "Python for Data  Analysis", "publication_year": "2012", "topic": "programming"}, 
     {"author": "Joel Grus", "price": 66, "title": "Data Science from Scratch", "publication_year": "2015", "topic": "Python"} 
    ] 

>>> sorted(my_json, key=lambda x: x["author"].split()[-1]) 
[{'topic': 'Python', 'price': 66, 'title': 'Data Science from Scratch', 'publication_year': '2015', 'author': 'Joel Grus'}, {'topic': 'programming', 'price': 53, 'title': 'Python for Data  Analysis', 'publication_year': '2012', 'author': 'Wes McKinney'}] 
0

Sie müssen nur die jsondata Liste mit einer entsprechenden Schlüsselfunktion sortieren, die die Nachnamen aus dem Wert mit jedem „Autor“ Schlüssel der dict zugeordnet extrahiert.

Ich habe die .rsplit Methode verwendet, so dass wir effizient mit Suther umgehen können, die mehr als 2 Namen haben. .rsplit(None, 1) teilt die Zeichenfolge in Whitespaces von rechts auf, wobei (höchstens) eine Teilung vorgenommen wird und eine Liste zurückgegeben wird, die (höchstens) zwei Elemente enthält. Der Nachname ist das letzte Element dieser Liste. Wenn Sie möchten, dass der Nachname von "Guido Van Rossum" "Van Rossum" lautet, müssen Sie eine andere Splitting-Strategie verwenden.

import json 

jsondata = [ 
    { 
     "author": "Wes McKinney", "price": 53, 
     "title": "Python for Data  Analysis", 
     "publication_year": "2012", "topic": "programming" 
    }, 
    { 
     "author": "Joel Grus", "price": 66, 
     "title": "Data Science from Scratch", 
     "publication_year": "2015", "topic": "Python" 
    }, 
    { 
     "author": "One", 
    }, 
    { 
     "author": "Person With A Long Name", 
    }, 
] 

def last_name(d): 
    return d["author"].rsplit(None, 1)[-1] 

# Verify that `last_name` does what we want 
for d in jsondata: 
    print(last_name(d)) 

jsondata.sort(key=last_name) 

print(json.dumps(jsondata, indent=4)) 

Ausgang

McKinney 
Grus 
One 
Name 
[ 
    { 
     "title": "Data Science from Scratch", 
     "author": "Joel Grus", 
     "topic": "Python", 
     "publication_year": "2015", 
     "price": 66 
    }, 
    { 
     "title": "Python for Data  Analysis", 
     "author": "Wes McKinney", 
     "topic": "programming", 
     "publication_year": "2012", 
     "price": 53 
    }, 
    { 
     "author": "Person With A Long Name" 
    }, 
    { 
     "author": "One" 
    } 
] 
Verwandte Themen