2017-08-14 2 views
0

Je suis en train d'écrire une fonction pour faire pousser un arbre:Passing modifié la liste à chaque noeud d'arbre binaire

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 

Ma question est, pour chaque scission matching_list (par exemple deux), je veux ajouter différentes chaînes à la liste existante à ce moment-là (ie je veux deux versions de liste).

Dans ce cas, la fonction collect_append que j'utilise modifie la liste lors de la première itération de la boucle for et l'utilise de la même manière pour d'autres itérations. Ce que je veux, c'est juste modifier la liste collect juste pour le paramètre et sans le changer de façon permanente. Y a-t-il un moyen de faire cela?

+0

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. – Prune

Répondre

1

Je vois deux erreurs graves dans votre code. Tout d'abord, cette clause est else jamais exécuté:

for j in passwords: 
    for i in range(...): 
     if ...: 
      break 
else: 
    ... 

Depuis le break est dans la boucle for intérieure, la boucle for extérieure est jamais quitté par un break de sorte que le else est jamais pris. En second lieu, cela ne veut pas faire ce que vous voulez:

string.strip(split) 

Vous essayez de supprimer split depuis le début de string mais vous supprimez toutes les lettres split des deux extrémités de string, ecchymoses mal. Voici une façon de le faire correctement:

string[len(split):] 

Je vais sortir sur un membre, et réécrire votre code pour faire ce que je pense que vous voulez faire:

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) 

SORTIE

% python3 test.py 
True 
[['dog', ['cat', ['cher']], ['catch', ['er']]], ['dogcat', ['cher']], ['dogcatcher']] 
% 

vous donner un arbre de toutes les façons de rassembler string des mots passwords.

+0

Merci! Exactement ce que je voulais –