2012-11-18 49 views
6

Tôi hiện đang nhận dữ liệu JSON từ API discogs (dữ liệu thẻ mp3) và muốn sắp xếp kết quả theo giá trị của khóa. Trong trường hợp này, tôi đang cố gắng lấy dữ liệu cho bài hát Guns n Roses và đầu ra có 1988 là dữ liệu đầu tiên trong khi dữ liệu thực sự có bản ghi từ năm 1987. Làm cách nào để sắp xếp dữ liệu này để tôi có thể truy cập dữ liệu được sắp xếp theo năm (cũ hơn đến mới nhất). Mã dưới đây sắp xếp theo một trong hai khóa hoặc giá trị nhưng đó không phải là những gì tôi dự định nhận được. Hãy giúp tôi.Sắp xếp dữ liệu JSON theo khóa giá trị

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

Tôi muốn trợ giúp nếu bạn đưa vào mẫu dữ liệu JSON .. –

+0

Theo giao diện của nó, bạn đang sử dụng [API này] (http://www.discogs.com/developers/resources/database/search-endpoint.html). –

Trả lời

12

Bạn có thể sử dụng danh sách-hiểu và sorted() chức năng cho việc này:

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

hay:

In [79]: from operator import itemgetter 

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

Hơn bạn, điều này hoạt động như một say mê, như bạn có thể nói, tôi là một newbie và có một chặng đường dài để đi .. –

1

Để sắp xếp danh sách từ điển, hãy sử dụng methodcaller với khóa để sắp xếp; bạn muốn sắp xếp các danh sách , không phải từ điển chứa. Hơn nữa, một số các mục không một năm, và có thể dẫn đến sai sót:

from operator import methodcaller 

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

Định nghĩa methodcaller về cơ bản sẽ làm một entry.get('year', None) cho mỗi mục trong json_object['results'], đưa ra các phương pháp sorted giá trị để sắp xếp trên.

Bạn nên không sử dụng readlines() để đọc phản hồi JSON của bạn, nó sẽ diễn giải sai dòng mới. Hãy để cho thư viện json làm người đang đọc thay vì (chú ý .load(), không s ở cuối):

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

Tôi mới tham gia diễn đàn này và tôi không thể đăng JSON vì nó nói rằng tôi còn vài ký tự để đăng ... –

+0

Xem [Làm cách nào để định dạng khối mã của tôi?] (Http: // meta. stackexchange.com/q/22186) để được trợ giúp thêm. –

+0

Tôi không chắc mình đang làm gì sai, nhưng khi tôi chạy ngay bây giờ, tôi gặp lỗi: –

Các vấn đề liên quan