【问题标题】:convert string to list within recursive function在递归函数中将字符串转换为列表
【发布时间】:2017-09-17 21:12:13
【问题描述】:

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

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']

【问题讨论】:

  • NameError: 未定义全局名称“项目”

标签: string list python-3.x recursion reverse


【解决方案1】:

想想你想要的返回类型,以及你要返回的表达式:

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

你有一个字符串列表。所以some_list[0] 将是一个字符串。您正在返回一个字符串,以及其他任何内容。

如果你想返回一个列表,以某种方式将字符串变成一个列表:

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

【讨论】:

  • 我尝试使用 return [some_list[0]] + ... 但添加额外的括号给了我一个错误,因为我忘记将我的基本情况也更改为列表
【解决方案2】:

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

另外,在这一行:

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)

返回

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

【讨论】:

    【解决方案3】:

    您的 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]
    

    【讨论】:

      【解决方案4】:

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

      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]
      

      【讨论】:

      • 这些都很棒!我对 python 很陌生,我的代码仍然很笨重。我喜欢列表推导,我只是不太擅长它们......但是!
      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 2015-07-14
      • 2014-12-03
      • 1970-01-01
      • 2021-11-24
      • 2017-07-11
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多