2014-01-10 37 views
1

在我的代碼中,我正在使用split_message列表和查詢API。如果沒有結果,我的下一步就是將列表的索引減1,因此我從列表中刪除最後一項並重試搜索。如果再沒有結果,我想重複這個過程直到我收到結果。如何遞減循環中的列表索引


import requests 
import json 

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

split_message = message.split() 

length = len(split_message) 

def decrementList(): 
    initial_request = requests.get('http://ws.spotify.com/search/1/track.json?q='+"%20" 
            .join(split_message[:])) 
    json_string = initial_request.content 
    json_dict = json.loads(json_string) 
    num_results = json_dict['info']['num_results'] 
    if num_results == 0: 
     print "Sorry, no match!" 
    if num_results > 0: 
     print "Result found!" 

decrementList() 

實際上,我的下一個步驟將是藉此:

requests.get('http://ws.spotify.com/search/1/track.json?q='+"%20" 
             .join(split_message[:])) 

,並把它變成這樣:

requests.get('http://ws.spotify.com/search/1/track.json?q='+"%20" 
             .join(split_message[:-1])) 

,然後這樣的:

requests.get('http://ws.spotify.com/search/1/track.json?q='+"%20" 
             .join(split_message[:-2])) 

並重復,直到我得到一場比賽。

我可以想到非常非pythonic的方式來做到這一點,但它似乎太多,如果語句。那麼,我想要完成的是什麼樣的最好和最pythonic解決方案?

+0

這可能很慢,因爲您會發出多個網絡請求,而不是因爲您如何處理列表。 – Keeler

+0

慢可能是使用錯誤的詞。不是真的很慢,只是尋找比10 if語句更爲pythonic的做法。現在從帖子中刪除它。 – metersk

回答

1

編輯

其實,我喜歡這個版本的更多。有點更清潔恕我直言。

def decrementList(words): 
    words_remaining = words[:] 
    while words_remaining: 
     url = 'http://ws.spotify.com/search/1/track.json?q=' 
     request = requests.get(url + '%20'.join(words_remaining)) 

     json_dict = json.loads(request.content) 
     if json_dict['info']['num_results'] > 0: 
      num_words_taken = len(words) - len(words_remaining) 
      return num_words_taken, json_dict 

     words_remaining.pop() 

得到了list.pop靈感來自@falsetru,看其他的答案。

原來的答案

也許這是根據自己的喜好:

import requests 
import json 

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

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) 
      return num_removed, json_dict 

num_words_removed, json_dict = decrementList(split_message) 

的關鍵是[words] + [words[:-x] for x in range(1,len(words))]。假設words = message.split(),你得到的名單

[ 
    ['if', 'i', 'can', 'let', 'it', 'go', 'out', 'of', 'my', 'mind'], 
    ['if', 'i', 'can', 'let', 'it', 'go', 'out', 'of', 'my'], 
    ['if', 'i', 'can', 'let', 'it', 'go', 'out', 'of'], 
    ['if', 'i', 'can', 'let', 'it', 'go', 'out'], 
    ['if', 'i', 'can', 'let', 'it', 'go'], 
    ['if', 'i', 'can', 'let', 'it'], 
    ['if', 'i', 'can', 'let'], 
    ['if', 'i', 'can'], 
    ['if', 'i'], 
    ['if'] 
] 

我相信這是你想要的東西,它可以說是「Python化」。只要你得到你想要的結果,函數就會跳出循環。它返回從列表中移除的單詞數量以獲得一些結果,以及由請求產生的JSON字典。

+0

'[範圍內的單詞[x:](len(words))]'應該是'[words [:x] for range in(len(1,words))]' – falsetru

+0

@falestru。接得好。 – Keeler

+0

爲什麼你添加num_words_removed,json_dict =到最後? – metersk

1

使用list.pop

>>> message = "if i can\'t let it go out of my mind" 
>>> split_message = message.split() 
>>> split_message.pop() 
'mind' 
>>> split_message 
['if', 'i', "can't", 'let', 'it', 'go', 'out', 'of', 'my'] 
>>> split_message.pop() 
'my' 
>>> split_message 
['if', 'i', "can't", 'let', 'it', 'go', 'out', 'of'] 
+0

我不想從列表中刪除該項目。我需要保持整個列表完整以備後用。我仍然可以使用這種方法嗎? – metersk

+0

@Barnaby,製作副本如何? 'copy = split_message [:]' – falsetru

+0

我會試試這個,謝謝!其實,另一個問題是 – metersk