2017-09-10 50 views
0

試圖檢查是否可以從字符列表中創建一個單詞。如果它能夠從機架中的字母製成,則返回該單詞,如果不能,則返回空白字符串。我收到錯誤TypeError: can only concatenate list (not "str") to listPython中的遞歸字檢查

def checkWord(rack,word,hold): 
    if word == "": return hold 
    if rack[0] == []: return "" 
    if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold) 
    return checkWord(rack[1:] + rack[0], word, hold) 
print(checkWord(["a", "s", "m", "t", "p"], "am", "am")) 
+2

我想rack [0]是一個str而不是一個列表,並且您試圖將它添加到rack [1:] – bhansa

+0

(如果/返回,您將使用oneline節省空間,但不是太多可讀性) – PRMoureu

+0

另外,您知道可以更好地執行此操作* non * -recursively,對嗎?假設這不是一項任務。 – EvilTak

回答

0

您不能連接列表以及一個字符串,所以你必須使用兩個字符串,或者列出了兩個,試試這個

def checkWord(rack,word,hold): 
    if word == "": return hold 
    if rack[0] == []: return "" 
    if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold) 
    return checkWord(str(rack[1:]) + str(rack[0]), word, hold) 
print(checkWord(["a", "s", "m", "t", "p"], "am", "am")) 

或本

def checkWord(rack,word,hold): 
    if word == "": return hold 
    if rack[0] == []: return "" 
    if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold) 
    return checkWord(list(rack[1:]) + list(rack[0]), word, hold) 
print(checkWord(["a", "s", "m", "t", "p"], "am", "am")) 
0

一個bhansa評論,你的問題是連接rack[1:]rack[0]。如果rack是列表,則片段rack[1:]也是如此。但是,rack[0]將成爲列表中的單個值。您可能想用替換爲[rack[0]](用單個項目創建新列表)或rack[:1](從列表中切下一個項目)。

值得注意的是,如果您的輸入爲rack是一個字符串,那麼您的原始代碼將起作用(至少,該部分會)。這是因爲字符串是一種奇怪的容器,因爲索引和切片都會給你另一個字符串。

最後一點:您的基本情況if rack[0] == []: return ""將永遠不會與您顯示的輸入一起運行。它看起來是否在rack列表中的第一項是另一個列表。既然你傳遞了一個字符列表(並且只在遞歸調用中重新排列它們),那永遠不會是真的。它可能工作,如果你通過一個rack列表通過一個特殊sentenel值添加到最後(所以你可以告訴你什麼時候你已經完全旋轉你的原始列表)。但那不是你在做什麼。這種方法也會弄亂另一個遞歸的情況(因爲它沒有任何方法可以在空字符串匹配一個字符後將它移回到最後)。

0
def checkWord(rack,word,hold): 
    try: 
     if word == "": return hold 
     if rack[0] == []: return "" 
     if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold) 
     return checkWord(str(rack[1:]) + str(rack[0]), word, hold) 
    except: 
     print('it cant') 

checkWord(['a','c','b'],'ac','ac') ## return ac 
checkWord(['a','c','b'],'dac','dac') ## return It cant 

,但我認爲這是混淆的錯誤,你的函數要麼返回true,或陷入無邊循環(如果機架不包含字母), 應該檢查,如果字母是在保持 - >存儲 - >檢查是否得到所有字母 - >如果得到返回保持字,否則繼續循環直到結束

而不是檢查單詞[0]並返回單詞[1:],比以後這樣 你也忘了添加一個「無法形成單詞」,而不會出現異常

+0

使用'str(rack [1:])'幾乎肯定是錯誤的。如果'rack'是一個列表,調用'str'就會給你一個字符串,例如'['c','b']「'帶括號和全部。我認爲要麼*調用*代碼需要改變爲使用字符串,或者你可以堅持使用整個列表,只有連接的第二部分需要改變。 – Blckknght

+0

這不是唯一的錯誤,我談論了代碼如何做不到他想要做的事情,以及如何解決它,並讓他選擇是否他想讓我給出更好的解釋,我只是做了一些最小的修改了他編寫的代碼 – zero