2012-11-18 22 views
6

मुझे वर्तमान में डिस्कॉग एपीआई (एमपी 3 टैग डेटा) से जेएसओएन डेटा मिल रहा है और परिणामों को कुंजी के मूल्य से क्रमबद्ध करना चाहता हूं। इस मामले में मैं गन्स एन रोज़ेस गीत के लिए डेटा प्राप्त करने की कोशिश कर रहा हूं और आउटपुट में 1 9 88 में पहली बार डेटा है जबकि डेटा वास्तव में 1 9 87 से रिकॉर्ड है। मैं इस डेटा को कैसे क्रमबद्ध कर सकता हूं ताकि मैं क्रमबद्ध डेटा प्राप्त कर सकूं वर्ष (सबसे पुराना)। नीचे दिया गया कोड या तो कुंजी या मूल्य से है, लेकिन यह वह नहीं है जिसे मैं प्राप्त करना चाहता हूं। कृपया मदद करे।कुंजी मान द्वारा 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

इसे देखकर, आप [इस एपीआई] (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 विधि मूल्य दे रही है पर।

आपको अपने JSON प्रतिक्रिया को पढ़ने के लिए readlines() का उपयोग करना चाहिए, यह न्यूलाइन की गलत व्याख्या करेगा। 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: // मेटा। stackexchange.com/q/22186) अधिक सहायता के लिए। –

+0

मुझे यकीन है कि मैं गलत क्या कर रहा हूँ नहीं कर रहा हूँ, लेकिन जब मैं इस चलाने के लिए, मैं एक त्रुटि मिलती है: –

संबंधित मुद्दे