我正在编写一个种植树的函数:
def collect_append(collect,split):
collect.append(split)
return collect
def tree(string,passwords,collect): #collect is a list and passwords is also a list
matching_list = []
match = 0
if len(string)==0:
print(collect)
return 0
for j in passwords:
for i in range(min(len(j),len(string))):
if string[i]!=j[i]:
break
else :
matching_list.append(j)
match = match + 1
if match == 0:
return 1
else:
for split in matching_list:
x =tree(string.strip(split),passwords,collect_append(collect,split))
return x
我的问题是,对于matching_list中的每个分割(比方说两个),我想在此时向现有列表添加不同的字符串(即我想要两个版本的列表)。
在这种情况下,我使用的collect_append
函数在for
循环的第一次迭代中修改列表,并使用相同的函数进行进一步的迭代。我想要的是只修改参数的collect
列表,而不是永久更改它。有没有办法做到这一点?
答案 0 :(得分:1)
我在您的代码中看到两个严重错误。首先,永远不会执行此else
子句:
for j in passwords:
for i in range(...):
if ...:
break
else:
...
由于break
位于内部for
循环中,因此永远不会通过for
退出外部break
循环,因此永远不会使用else
。其次,这并不是你想要的:
string.strip(split)
您正试图从split
的开头删除string
,但是您要从split
的两端删除string
中的所有字母,严重受伤。这是正确执行此操作的一种方法:
string[len(split):]
我要走出困境,重写你的代码,做我认为你想做的事情:
def tree(string, passwords, collect):
length = len(string)
if length == 0:
return False
matching_list = []
for j in passwords:
i = min(len(j), length)
if string[:i] == j[:i]:
matching_list.append(j)
if not matching_list:
return False
result = False
for split in matching_list:
local_collection = list([split])
if split == string or tree(string[len(split):], passwords, local_collection):
collect.append(local_collection)
result = True
return result
collection = []
print(tree('dogcatcher', ['cat', 'catch', 'cher', 'dog', 'dogcat', 'dogcatcher', 'er'], collection))
print(collection)
<强>输出强>
% python3 test.py
True
[['dog', ['cat', ['cher']], ['catch', ['er']]], ['dogcat', ['cher']], ['dogcatcher']]
%
通过string
中的字词,为您提供汇总passwords
的所有方法的树。