使用python中的递归解决方案在字符串列表中查找字谜

Posted

技术标签:

【中文标题】使用python中的递归解决方案在字符串列表中查找字谜【英文标题】:find anagrams in a list of string using recursive solution in python 【发布时间】:2021-05-12 22:39:04 【问题描述】:

我正在尝试解决以下问题:有一个类似下面的列表:

["hi", "ih", "ciao", "aoic", "bar", "foo", "rab", "oof"]

并且在被传递给函数之后,列表应该被简化为只出现在列表中的那些元素,不包括它们之后的所有字谜。

所以它应该输出:

["hi", "ciao", "bar", "foo"]

我正在尝试以递归方式解决这个问题,并拥有当前的解决方案,该解决方案由于变量结果(最后返回 stmt)上的“赋值前引用”错误而中断。

非常感谢任何提示!

def f(ls):
        
    def is_not_ana(first, word):
        return not sorted(first) == sorted(word) and word or None
    
    if ls:
        first = ls[0]
        rest = ls[1:]
        legal_str = [is_not_ana(first, word) for word in rest]
        result = list(filter(None, [first] + legal_str))
        
        return f(result[1:])
    else:
        return result

【问题讨论】:

【参考方案1】:

当您到达递归结束时,ls 为空,因此当您返回 result 时,它永远不会在最后一次调用中定义。

您忘记返回first。将return f(result[1:]) 更改为return [first] + f(result[1:])

返回一个空列表将修复您的错误:

def f(ls):
    def is_not_ana(first, word):
        return not sorted(first) == sorted(word) and word or None

    if ls:
        first = ls[0]
        rest = ls[1:]
        legal_str = [is_not_ana(first, word) for word in rest]
        result = list(filter(None, [first] + legal_str))

        return [first] + f(result[1:])
    else:
        return []


print(f(["hi", "ih", "ciao", "aoic", "bar", "foo", "rab", "oof"]))
# ['hi', 'ciao', 'bar', 'foo']

【讨论】:

以上是关于使用python中的递归解决方案在字符串列表中查找字谜的主要内容,如果未能解决你的问题,请参考以下文章

在python list/df中递归查找密钥对关系

递归序列python

如何使用方案编程语言查找字符串中的字符数?

python3在文件夹中查找指定文件方法封装

如何在python列表中查找某个元素的索引

Python - 如何递归搜索作为列表元素的文本中的变量子字符串