2017-09-10 48 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