在递归函数中将字符串转换为列表

convert string to list within recursive function

我编写了这个递归函数来检查列表中的特定字符串,如果找到该字符串,它应该在列表中反向返回,但我似乎无法将列表保留为列表。我的输出是一个连接的字符串。有人可以建议如何维护列表类型吗?

test_list = ['cat', 'hat', 'bat', 'sat']
test_string = 'bat'

def reverser(some_list, some_string):

    if some_list == []:
        return ''
    elif len(some_list) == 1 and item in some_list == some_string:
        return some_string[::-1] 
    else:
        if some_list[0] == some_string:
            return some_string[::-1] + reverser(some_list[1:], some_string)
        if some_list[0] != some_string:
            return some_list[0] + reverser(some_list[1:], some_string)
reverser(test_list, test_string)

输出为:

'cathattabsat'

但我希望它是:

['cat', 'hat', 'tab', 'sat']

考虑您想要的 return 类型,以及您要 return 的表达式:

return some_list[0] + reverser(some_list[1:], some_string)

您有一个字符串列表。所以 some_list[0] 将是一个字符串。您正在 return 字符串,加上任何内容。

如果你想return一个列表,把字符串变成一个列表:

return some_list[0:1] + ...
return [some_list[0]] + ...

如果您希望该函数 return 一个字符串列表,您需要确保在基本情况下以及在循环中添加适当的列表而不是字符串。

此外,在这一行中:

elif len(some_list) == 1 and item in some_list == some_string:

item 未定义。您可以将此行替换为:

elif len(some_list) == 1 and some_string in some_list

最后,这将完成工作:

test_list = ['cat', 'hat', 'bat', 'sat']
test_string = 'bat'


def reverser(some_list, some_string):

    if some_list == []:
        return []
    elif len(some_list) == 1 and some_string in some_list:
        return [some_string[::-1]] 
    else:
        if some_list[0] == some_string:
            return [some_string[::-1]] + reverser(some_list[1:], some_string)
        if some_list[0] != some_string:
            return [some_list[0]] + reverser(some_list[1:], some_string)
reverser(test_list, test_string)

这个returns

['cat', 'hat', 'tab', 'sat']

您的 return 语句 return 始终是一个字符串。

return some_string[::-1] + reverser(some_list[1:], some_string)

注意:some_string[::-1]是一个字符串

将其包裹在 [] 中,使其成为包含一项的列表。

return [some_string[::-1]] + reverser(some_list[1:], some_string)

但是,有一种方法比您正在执行的这个奇怪的循环要简单得多。您可以使用地图或列表理解。

def reverse_string(any, match):
    if any == match: return any[::-1]
    else: return any

def reverser(some_list, some_string):
    return [reverse_string(s, some_string) for s in some_list]

你的递归函数比它需要的更复杂:

def reverser(some_list, some_string):
    if some_list == []:
        return []

    word = some_string[::-1] if some_list[0] == some_string else some_list[0]
    return [word] + reverser(some_list[1:], some_string)

但是正如另一位回答者所提到的,通过列表理解可以更好地完成此操作:

[word[::-1] if word == some_string else word for word in some_list]