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

find anagrams in a list of string using recursive solution in python

我正在尝试解决以下问题:有如下列表:

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

并且在传递给一个函数之后,列表应该被简化为只有那些首先出现在列表中的元素,排除它们之后的所有变位词。

所以它应该输出:

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

我试图递归地解决这个问题,并且有当前的解决方案,由于变量结果(最后一个 return 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

当您到达递归的末尾时,ls 为空,因此当您 return result 时,它永远不会在最后一次调用中定义。

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

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

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