将修改后的列表传递给二叉树的每个节点

时间:2017-08-14 15:02:51

标签: python python-3.x recursion tree

我正在编写一个种植树的函数:

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列表,而不是永久更改它。有没有办法做到这一点?

1 个答案:

答案 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的所有方法的树。