2013-01-27 5 views
0

Я извлекаю данные с помощью API-интерфейсов Discogs, и я хотел бы ограничить JSON только записями, которые имеют формат как «CD» или «Album» или «Maxi-Single». Я не уверен, как фильтровать полученные данные, поскольку Discogs не имеет более простого способа отфильтровать это из самого исходного запроса. Вы заметите, что упомянутый ниже URL JSON имеет «DVD» и «VHS», которые я бы хотел опустить. Любая идея/подсказки, как я могу отфильтровать это после извлечения? URLPython JSON Как фильтровать возвращенные данные

JSON: http://api.discogs.com/database/search?sort=year&sort_order=asc&artist=Britney+Spears&track=Crazy+Stop+Remix&type=master

Python

url = 'http://api.discogs.com/database/search?sort=year&sort_order=asc&artist=Britney+Spears&track=Crazy+Stop+Remix&type=master' 
request = urllib2.Request(url) 
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_object = json.load(response) 
if json_object['results'] == []: 
    print 'No results found' 
else: 
    json_object_results_by_year=[x for x in json_object['results'] if 'year' in x] 
    json_sorted_results = sorted(json_object_results_by_year,key=lambda x:x['year']) 
    #print json_sorted_results 
+0

Это не фильтрует это потому, что он соответствует любому название, которое перечисляет эту дорожку; соответствующие выпуски могут поступать в нескольких форматах. –

+0

Я мог бы присягнуть * Я видел этот вопрос раньше. Ах, неважно, это был API MusicBrainz. И это был ваш вопрос. : -P –

ответ

3
wanted = {u'CD',u'Album',u'Maxi-Single'} 
[i for i in json_object[u'results'] if any(w in wanted for w in i[u'format'])] 

или

[i for i in json_object[u'results'] if any(w in i[u'format'] for w in wanted)] 
+0

Я думаю, вы хотите сделать 'any (w in wanted for w in i [u'format '])' потому что 'i [u'format']' это список и 'wanted' - это набор, поэтому Операция 'in' должна быть более эффективной на множестве. – milkypostman

+0

@milkypostman - нет большой разницы ... Но поскольку все предметы в розыгрыше совпадают, 'any' будет коротко замыкаться быстрее в среднем таким образом :) Проверка на членство быстрее с датой набора ... – root

+0

hrm, это имеет смысл. я думаю, худший случай ... – milkypostman

Смежные вопросы