2016-04-16 7 views
0

Ich habe eine schwierige Wörterbuch in suchen:JSON Wörterbuch Lookup

{'results': 
     {'opensearch:itemsPerPage': '1', 'artistmatches': 
       {'artist': [{'streamable': '0', 'image': 
         [{'#text': 'http://img2-ak.lst.fm/i/u/34s/d593a102f004491689bc7e07d8fb09ba.png', 'size': 'small'}, 
         {'#text': 'http://img2-ak.lst.fm/i/u/64s/d593a102f004491689bc7e07d8fb09ba.png', 'size': 'medium'}, 
         {'#text': 'http://img2-ak.lst.fm/i/u/174s/d593a102f004491689bc7e07d8fb09ba.png', 'size': 'large'}, 
         {'#text': 'http://img2-ak.lst.fm/i/u/300x300/d593a102f004491689bc7e07d8fb09ba.png', 'size': 'extralarge'}, 
         {'#text': 'http://img2-ak.lst.fm/i/u/d593a102f004491689bc7e07d8fb09ba.png', 'size': 'mega'}], 
         'listeners': '3251959', 'name': 'Michael Jackson'}]}}} 

Jetzt versuche ich mit der größten Größe möglich (Mega wenn möglich) den Wert mit der Taste = ‚#text‘ zu bekommen.

Gibt es eine einfache Möglichkeit, dieses Wörterbuch zu durchlaufen, oder muss ich viele for-Schleifen verwenden?

+0

Gäbe es mehrere "Künstler" -Einträge, oder guckst du nur auf den ersten? –

+0

@MartijnPieters wird es mehr Künstlereinträge geben, aber ich suche nur nach dem ersten. –

Antwort

1

Definieren Sie einen Wörterbuch mit relativer Ordnung:

sizes = ('small', 'medium', 'large', 'extralarge', 'mega') 
sizemap = {size: value for value, size in enumerate(sizes)} 

verwenden, die mit der max() Funktionskarte die maximale Bildgröße für einen bestimmten artist Eintrag zu finden:

for artist in data['results']['artistmatches']['artist']: 
    image = max(artist['image'], key=lambda i: sizemap[i['size']]) 
    image_url = image['#text'] 

Demo (mit data gebunden das in Ihrer Frage angegebene Wörterbuch):

>>> for artist in data['results']['artistmatches']['artist']: 
...  image = max(artist['image'], key=lambda i: sizemap[i['size']]) 
...  image_url = image['#text'] 
...  print(image_url) 
... 
http://img2-ak.lst.fm/i/u/d593a102f004491689bc7e07d8fb09ba.png 
+0

♦ Schön! Was macht das Lambda? –

+1

@DriesCoppens: Erzähle 'max()' wie man den Wert extrahiert, um zu maximieren. Für jedes Wörterbuch in 'artist [' image ']' ist der zu maximierende Wert die Übersetzung der '' size''-Taste über das 'Sizemap'-Wörterbuch. Also wird "Größe": "Mega" in einem Bildwörterbuch in "4" übersetzt, was höher ist als bei allen anderen abgebildeten Größen. –