2016-08-19 4 views
4

Iterieren durch JSONresults kann manchmal ziemlich verwirrend werden. sagen, ich habe ein function wie so:Python :: Iterate durch verschachtelte JSON-Ergebnisse

def get_playlist_owner_ids(query): 

    results = sp.search(q=query, type='playlist') 
    id_ = results['playlists']['items'][0]['owner']['id'] 
    return (id_) 

ich die id_ holen kann, es funktioniert.

aber wie wiederhole ich mit einer for i in x Schleife, so dass ich return ALL ids_?

+2

All das 'ID's? Sie müssen uns die Struktur Ihrer 'Ergebnis'-Datenstruktur zeigen (und auf welcher Ebene oder welchen Ebenen Sie die' ID'-Werte haben möchten), damit dies beantwortbar ist. Vielleicht willst du '[x ['owner'] ['id'] für x in den Ergebnissen ['Playlists'] ['items']]', aber das ist nur eine Vermutung. – Blckknght

Antwort

3
results['playlists']['items'][0]['owner']['id'] 
           ^___ this is a list index 

So:

for item in results['playlists']['items']: 
    print(item['owner']['id']) 

Es ist oft praktisch Zwischenvariablen zu machen, um Dinge zu halten, besser lesbar.

playlist_items = results['playlists']['items'] 
for item in playlist_items: 
    owner = item['owner'] 
    print(owner['id']) 

Dies ist vorausgesetzt, ich habe die Struktur Ihres Objekts basierend auf nur was Sie gezeigt haben richtig geraten. Hoffentlich geben Ihnen diese Beispiele jedoch einige bessere Möglichkeiten, komplexe Strukturen in sinnvolle Abschnitte aufzuteilen.

+0

haben Sie richtig geraten. obwohl ein Listenverständnis die Datenstruktur wie folgt zurückgeben würde: '[u'handiofiblood ', u'holgar_the_red', uthedoomlord ', u'slokra', u'1121479704 ', u'joakim56789', u'twiggywasp ', u 'killnot', u'slashxero ', u'sandpapersparkle'] ', daher wäre es auf eine effizientere Weise für die weitere Verarbeitung nicht so gut lesbar. Ich könnte die Ergebnisse auch an eine leere Liste anhängen. Vielen Dank. –

0

Wie wäre es damit? Sie können Generator verwenden Ihr Ziel

def get_playlist_owner_ids(query): 
    results = sp.search(q=query, type='playlist') 
    for item in results['playlists']['items']: 
     yield item['owner']['id'] 
+0

Warum ein Generator? Die gesamte Struktur scheint bereits in den Speicher geladen zu sein. –

0

Sie könnten iterieren results['playlists']['items'], oder noch besser, verwenden Liste Verständnis zu erreichen:

def get_playlist_owner_ids(query): 

    results = sp.search(q=query, type='playlist') 
    return [x['owner']['id'] for x in results['playlists']['items']] 
0

In der Praxis Ihr Dokument ist so etwas wie dieses:

{ "playlists": { 
    "items":[ 
     {"owner":{"id":"1"},...},     
     {"owner":{"id":"2"},...}, 
     {"owner":{"id":"3"},...}, 
     ..., 
} 

Sie müssen also die Liste der Elemente durchlaufen.

Sie können so etwas wie dieses

ids = [] 
items = results['playlists']['items'] 
for item in items: 
    ids.append(item['owner']['id']) 

return ids 

tun Oder wenn Sie auf eine eine Zeile wollen:

ids = [item['owner']['id'] for owner in results['playlists']['items']] 
+0

Ihr One-Liner ist nicht ganz richtig. 'Besitzer ['Besitzer'] ['ID']' –