Rekursive looping-Funktion in Python
Ich habe eine Datenbank, die Modelle einer foldering Beziehung zu n
Ebenen verschachteln. Für jeden beliebigen Ordner, ich möchte erstellen Sie eine Liste aller untergeordneten Ordner.
Angenommen ich habe eine Funktion namens getChildFolders()
, was ist der effizienteste Weg, um Anruf dieser Art rekursive Schleife?
Der folgende code funktioniert für die 4 Ebenen verschachteln, aber ich möchte mehr Flexibilität bei der entweder die Angabe der Tiefe der Rekursion, oder in intelligent beenden die Schleife, wenn es keine Kinder mehr zu Folgen.
folder_ids = []
folder_ids.append(folder.id)
for entry in child_folders:
folder_ids.append(entry.id)
child_folders_1 = getChildFolders(entry.id)
for entry_1 in child_folders_1:
folder_ids.append(entry_1.id)
child_folders_2 = getChildFolders(entry_1.id)
for entry_2 in child_folders_2:
folder_ids.append(entry_2.id)
child_folders_3 = getChildFolders(entry_2.id)
for entry_3 in child_folders_3:
folder_ids.append(entry_3.id)
Sie sicher, dass Sie alle Unterverzeichnisse, unabhängig davon, auf welcher Ebene der Hierarchie Sie Leben, in eine flache Liste?
InformationsquelleAutor andyashton | 2010-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer rekursiven Funktion ist ein schöner Weg, um dies zu tun:
Beachten Sie die rekursive Grenze in python ist sehr gering
Sehen
sys.getrecursionlimit()
undsys.setrecursionlimit(limit)
.. der Standardwert ist 1000, aber Sie können es ein wenig. Es tut Absturz bis 8000 auf meinem Rechner 😉Die innere Funktion idiom, was nützlich ist, in vielen Sprachen, ist überflüssig in Python, weil Sie Standard-Argumente.
Das stimmt nicht, der Punkt der äußeren Funktion mit der Flasche it up und haben eine saubere definition, Dokumentation und eine einfachere rekursive Funktion. Vor allem, da bräuchte ich ein Standard-argument von
[]
, das können Sie nicht, schreiben Sie direkt in die definition.InformationsquelleAutor Jochen Ritzel
Ich generell vermeiden, Rekursion wie die Pest in python, weil es langsam und da der ganze stack-überlauf-Fehler-Sache.
Dies setzt Voraus, dass
getChildFolders
gibt eine leere Liste zurück, wenn es keine Kinder. Wenn es nicht etwas anderes, wie die Rückkehr einer sentinel-Wert oder eine Ausnahme auslösen, dann änderungen vorgenommen werden müssen.InformationsquelleAutor aaronasterling
Gut, der Fragesteller fragte, wie zu stoppen die Rekursion nach einer bestimmten Tiefe. Ich Stimme zu, es ist in der Regel eine schlechte Idee - also warum können Sie so etwas wie 1e9 als MAX_DEPTH, die ist praktisch unbegrenzt.
InformationsquelleAutor
Dies ist die am nächsten zu Ihrem code, und sehr unpythonic:
Sollten Sie sich wahrscheinlich für
os.walk
und nehmen einen ähnlichen Ansatz, um zu Fuss den Baum iterativ.os.walk
auch, aber er ist nicht zu Fuß, das Dateisystem, er hat ein komisches "Dateisystem in einer Datenbank" oder so etwas.Sah, dass. Korrigiert um zu reflektieren, was ich eigentlich meinte.
os.walk
ist rekursiv, nicht iterativ (ich habe die Quelle um sicher zu sein).So ist es implementiert Rekursion unter dem Deckmantel der iteration... Oh, die Ironie.
InformationsquelleAutor Lloeki
Brauchte ich etwas ähnliches einmal zu überprüfen, eine hierarchische Struktur. Sie könnten versuchen:
InformationsquelleAutor pedrovgp