2014-01-10 2 views
0

В моем коде ниже последний цикл определяет, есть ли совпадение или нет. Если есть совпадение, я хотел бы вернуть название дорожки, если они не совпадают, я хотел бы вернуться жВозвращаемые значения с помощью оператора else

import requests 
import json 

# initial message 
message = "if i can\'t let it go out of my mind" 

# split into list 
split_message = message.split() 

def decrementList(words): 
    for w in [words] + [words[:-x] for x in range(1,len(words))]: 
     url = 'http://ws.spotify.com/search/1/track.json?q=' 
     request = requests.get(url + "%20".join(w)) 

     json_dict = json.loads(request.content) 
     num_results = json_dict['info']['num_results'] 

     if num_results > 0: 
      num_removed = len(words) - len(w) 

      track_title = ' '.join(words) 

      #track_title = "If I Can't Take It with Me" 

      for value in json_dict["tracks"]: 
       if value["name"] == track_title: 
        return track_title 
       else: 
        return w 

      return num_removed, json_dict, track_title, w 


num_words_removed, json_dict, track_title, w = decrementList(split_message) 

К сожалению, это не мое идеальное решение. Я бы очень хотел перепрограммировать сокращенный список слов до тех пор, пока не будет найден трек. Я пробовал:

for value in json_dict["tracks"]: 
    if value["name"] == track_title: 
     return track_title 
    else: 
     decrementList(w) 

Но, у меня есть какой-то бесконечный цикл и тайм-аут мой запрос. Это имеет смысл в моей голове. Если нет соответствия треков, возьмите сокращенный список, сохраненный в «w», и повторите его через функцию декремента.

Итак, у меня есть два вопроса. Как я могу вернуть два значения в инструкции else, и как я могу повторно запустить сокращенный список до тех пор, пока не найду соответствие трека.

ответ

1

Сначала вам нужно рассмотреть, что вы хотите вернуть. Кажется, вы не решили на этом, потому что иногда вы возвращаете одно значение (track_title, w), иногда вы возвращаете кортеж (num_removed, json_dict, track_title, w). Это я не могу сделать для вас, и это зависит от того, что вам нужно позже.

Кроме того, я думаю, вы должны использовать генератор для получения результатов до тех пор, пока вызывающий не будет удовлетворен (лучше всего, а затем уменьшите качество соответствия, то есть с меньшими и меньшими совпадающими словами). Посмотрите на мою версии кода:

import requests 
import json 

# initial message 
message = "if i can't let it go out of my mind" 

# split into list 
split_message = message.split() 

def decrementList(words): 
    for w in [ words ] + [ words[:-x] for x in range(1, len(words)) ]: 
     url = 'http://ws.spotify.com/search/1/track.json?q=' 
     request = requests.get(url + "%20".join(w)) 

     json_dict = json.loads(request.content) 
     num_results = json_dict['info']['num_results'] 

     if num_results > 0: 
      num_removed = len(words) - len(w) 

      track_title = ' '.join(w) 

      for track in json_dict["tracks"]: 
       if track["name"].lower().startswith(track_title.lower()): 
        yield num_removed, track, track["name"], w 

def quote(s): 
    return '"' + ('%r' % ("'"+s.encode('utf-8')))[2:] 

for num_words_removed, track, track_name, w in decrementList(split_message): 
    print '%2d %s by %s (track %d on %s from %s)' % (
    num_words_removed, 
    quote(track_name), 
    quote(track['artists'][0]['name']), 
    int(track['track-number']), 
    quote(track['album']['name']), 
    track['album']['released']) 
+0

Вы, конечно, можете удалить строку 'если значение ...' также получить результаты, которые точно не начинаются с формулировкой сокращенного запроса. Таким образом, вы также получите «Если я не могу взять его со мной». – Alfe

+0

привет, спасибо за это. несколько деталей меня путают. я посмотрю, хотя! – metersk

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