2012-11-18 15 views
6

Şu anda diske API'den (mp3 tag data) JSON verileri alıyorum ve sonuçları anahtarın değerine göre sıralamak istiyorum. Bu durumda bir Guns n Roses şarkısı için veri elde etmeye çalışıyorum ve veriler 1987'de bir veri kaydı yaparken ilk çıktı olarak 1988'e ulaştı. Bu verileri nasıl sıralayabilirim ki sıralı verilere ulaşabilirim. yıl (en eskiden en eski). Aşağıdaki kod, anahtar veya değer ile sıralar ama ben almak istedim değil. Lütfen yardım et.JSON verilerinin anahtarlar değerlerine göre sıralanması

import json 
import urllib2 
request = urllib2.Request('http://api.discogs.com/database/search?sort=year&sort_order=asc&artist=%22Guns+N%27+Roses%22&track=%22Sweet+Child+O%27+Mine%22&format_exact=Album&type=master') 
request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)') 
request.add_header('Content-Type','application/json') 
response = urllib2.urlopen(request) 
json_raw= response.readlines() 
json_object = json.loads(json_raw[0]) 



for row in json_object['results']: 
    try: 
     from operator import itemgetter 
     for k, v in sorted(row.items(), key=itemgetter(0)): 
      print k, v 
    except KeyError: 
     pass 
+3

JSON verilerinin bir örneğini dahil ederseniz yardımcı olurum. –

+0

Görünüşe göre, [bu API] kullanıyorsunuz (http://www.discogs.com/developers/resources/database/search-endpoint.html). –

cevap

12

Bunun için liste-anlama ve sorted() işlevini kullanabilirsiniz

In [79]: from operator import itemgetter 

In [80]: sorted(results, key=itemgetter('year')) 
+0

Sizden, bu bir çekicilik gibi çalışır, söyleyebildiğiniz gibi, ben bir acemi ve gideceğim uzun bir yol var .. –

1

sıralamak için üzerinde anahtar ile bir methodcaller kullanın sözlükler bir listesini sıralamak için; içerdiği sözlükleri değil sonuçları listesini sıralamak istiyorsunuz. Üstelik kayıtların bazılarını yılda yok ve bu hatalara yol açabilir:

from operator import methodcaller 

for row in sorted(json_object['results'], key=methodcaller('get', 'year', None)): 
    # process the row dictionary 

methodcaller tanım temelde, json_object['results'] her giriş için bir entry.get('year', None) yapacak değerini sorted yöntemi vererek sıralamak üzerinde.

JSON yanıtınızı okumak için readlines() kullanın, yeni satırları yanlış yorumlayacaktır. json kütüphane yerine okuma (.load(), sonunda hiçbir s unutmayın) do edelim:

# filter json_object['results'] first, as some of the items are missing the key 'year' 

In [33]: results = [x for x in json_object['results'] if 'year' in x] 

In [34]: sorted(results, key=lambda x: x['year']) 

ya:

response = urllib2.urlopen(request) 
json_object = json.load(response) 
+0

Bu forumda yeniyim ve gönderebilmek için az sayıda karakterin kaldığını söyleyen JSON'u gönderemiyorum ... –

+0

[Kod bloklarımı nasıl biçimlendiririm?] (Http: // meta. Daha fazla yardım için stackexchange.com/q/22186). –

+0

Ben yanlış ne yapıyorum emin değilim, ama şimdi bu çalıştırdığınızda, bir hata alıyorum: –

İlgili konular