在 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']
我正在尝试解决以下问题:有如下列表:
["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']