2012-11-18 5 views
6

현재 discogs API (mp3 태그 데이터)에서 JSON 데이터를 가져오고 키 값으로 결과를 정렬하려고합니다. 이 경우 나는 Guns n Roses 노래에 대한 데이터를 얻으려고 노력하고 있으며, 데이터는 실제로 1987 년부터 기록이있는 반면 1988 년에는 처음으로 출력됩니다.이 데이터를 정렬하여 어떻게 정렬 된 데이터를 얻을 수 있습니까? 년 (가장 오래된 것부터 가장 최신). 아래의 코드는 키 또는 값에 따라 정렬되지만 원하는 것은 아닙니다. 도와주세요.키 값으로 JSON 데이터 정렬

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 데이터 샘플을 포함하면 도움이 될 것입니다. –

+0

외형 적으로 [this API] (http://www.discogs.com/developers/resources/database/search-endpoint.html)를 사용하고 있습니다. –

답변

12

당신은이에 대한 목록 - 이해와 sorted() 기능을 사용할 수 있습니다

In [79]: from operator import itemgetter 

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

너보다, 이건 매력처럼 느껴지 네. 나는 초보자이고 갈 길이 멀다. –

1

사전 목록을 정렬하려면 methodcaller을 정렬 할 키와 함께 사용하십시오. 포함 된 사전이 아닌 결과 목록을 정렬하려고합니다. 또한, 일부 항목은 는 올해이없는, 그것은 오류가 발생할 수 :

from operator import methodcaller 

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

methodcaller 정의는 기본적으로 json_object['results']의 각 항목에 대한 entry.get('year', None)을 할 것입니다 값을 sorted 방법을 제공하는 정렬 에.

이 아닌 은 readlines()을 사용하여 JSON 응답을 읽으면 뉴 라인을 잘못 해석합니다. json 라이브러리가 대신 읽는합니다 (.load(), 마지막에 s 주)하자 :

# 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']) 

나 :

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

나는이 포럼을 처음 사용하기 때문에 JSON을 게시 할 수 없다. 게시 할 글자 수가 적다. –

+0

[내 코드 블록을 어떻게 포맷합니까?] (http : // meta. stackexchange.com/q/22186)을 참조하십시오. –

+0

내가 뭘 잘못하고 있는지 잘 모르겠지만, 지금 이걸 실행할 때 오류가 발생한다. –