Seite 1 von 1

Implementierung der Baumstruktur in TreeCtrl

Verfasst: Mittwoch 10. Juni 2009, 08:28
von Braindie
Hi,

ich beschäftige mich seit einiger Zeit mit wx.python und möchte den Inhalt meiner Messdaten mittels einem Tree darstellen. Jedoch gehen mir so langsam die Ideen aus, wie ich meinen Tree erstelle.

Stand der Dinge:
Die Ausgabe des Pfades aus meiner Datenbank sieht wie folgt aus:
Ein Liste mit:
/Montag
/Montag/aa
/Montag/aa/1
/Montag/aa/1/test
/Montag/aa/2
/Montag/bb
/Montag/bb/1
/Dienstag
/Dienstag/aa
/Dienstag/aa/1
/Diesntag/aa/1/test
/Dienstag/aa/2
/Dienstag/bb
/Dientag/bb/1

Das ist jetzt ein einfachens Beispiel. Es kommen aber alle Kombinationen vor die man sich so denken kann.

Erst habe ich versucht eine Liste zu generieren die so aussieht wie
im Tutorial von Manning. Dazu hab ich die Liste beim "/" gesplittet, so dass ich die Namen direkt ansprechen konnte. Das hat leider bei mir wegen der Komplexität nicht geklappt. Dann habe ich versucht direkt die Äste und Zweige zu implementieren.
Da stoße ich jedoch auf das Problem, dass ich nicht weis wie ich feststellen kann ob der Knoten schon enthalten ist. Da es sich um Messwerte handelt, werden auf jeden fall doppelte Einträge vorkommen

Vielleicht hat jemand einen guten Vorschlag oder einen Lösungsansatz

Vielen Dank

Stefan

Verfasst: Donnerstag 11. Juni 2009, 10:50
von CM
Hoi,

ehrlich gesagt verstehe ich noch nicht einmal das Problem. Und da auch sonst niemand antwortet, könnte das ein allgemeines Phänomen sein.

Was ist denn eigentlich die Frage?

Gruß,
Christian

Verfasst: Donnerstag 11. Juni 2009, 12:21
von Braindie
Das habe ich mir auch schon gedacht.
Ich hab jetzt auch noch ein wenig weiter gebastelt.
Hier mal der Code wie ich den Tree erstelle.

Code: Alles auswählen

Name=[['','Montag'],['','Montag','a'],['','Montag','a','ab'],['','Montag','a','ab','abc'],
['','Dienstag'],['','Dienstag','a'],['','Dienstag','a','ab'],['','Dienstag','a','ab','abc']]

"""Baue Knoten der Baumstruktur auf"""
    def AddTreeNodes(self,parentItem):
        for i in numpy.arange(0,len(Name)-1):
            if len(Name[i])==2:
                List.append(self.tree.AppendItem(parentItem,Name[i][-1]))
            else:
                pattern= re.compile(Name[i][-2])
                for j,element in enumerate(List):
                    if pattern.match(self.tree.GetItemText(element)):
                        List.append(self.tree.AppendItem(List[j],Name[i][-1]))
Mein Problem ist, dass er in der letzten Schleife immer nur einen Item finden darf.
Jedoch zum Beispiel bei ['','Dienstag','a','ab'] das 'a' zweimal in meiner Suchliste findet und beide Knoten hinzufügt. Ich würde aber gerne den richtigen Knoten finden.

Vielleicht ist das jetzt ein bissle genauer.

Danke im Voraus
Stefan

Verfasst: Donnerstag 11. Juni 2009, 16:18
von Braindie
Jetzt habe ich geschafft meinen Baum zu implementieren, wie ich ihn haben möchte.
Hat jemand vielleicht ein paar Optminierungsvorschläge?

Code: Alles auswählen

Name=[['','Montag'],['','Montag','a'],['','Montag','a','ab'],['','Montag','a','ab','abc'],
['','Dienstag'],['','Dienstag','a'],['','Dienstag','a','ab'],['','Dienstag','a','ab','abc']
Test=[]
"""Baue Knoten der Baumstruktur auf"""
    def AddTreeNodes(self,parentItem):
        for i in numpy.arange(0,len(Name)):
            if len(Name[i])==2:
                List.append(self.tree.AppendItem(parentItem,Name[i][-1]))
                Test.append(Name[i])
            else:
                pattern= re.compile(Name[i][-2])
                
                for j,element in enumerate(List):
                   
                    if pattern.match(self.tree.GetItemText(element)):
            
                        if Name[i][0:-1]==Test[j]:
                            List.append(self.tree.AppendItem(List[j],Name[i][-1]))
                            Test.append(Name[i])
                        else:
                            pass
               
Gruss

Stefan

Verfasst: Donnerstag 11. Juni 2009, 16:24
von EyDu
Vorschläge doch immer:

- PEP8 anschauen
- in der ersten for-Schleife direkt über die Liste iterieren und die Indizes sparen
- das leere else mit dem pass kannst du sparen

Sebastian

Verfasst: Donnerstag 11. Juni 2009, 16:45
von CM
Stimme Sebastian zu. Und noch meine Vorschläge:

- Sebastian hat schon recht mit dem direkt iterieren, aber falls das mal nicht geht, kannst Du zwar über ein ndarray iterieren, wenn es sowieso besteht, aber es zum iterieren anzulegen ist keine gute Idee: Das kann sehr teuer werden. Besser ist es wohl xrange anstelle von numpy.arange in Zeile 7 zu verwenden. Noch besser: Direkt über die Liste iterieren.
- 'List' ist nicht sonderlich beschreibend. Gib' dem Kind doch den Namen, den es versteht, z. B. 'nodes' oder so.
- In Zeile 19 machst Du einen append-Aufruf in einem append-Aufruf. Das ist mit Sicherheit nicht optimal. Ohne Code drum herum, kann ich aber auch nicht sagen, wie es besser sein sollte.


HTH
Christian

Verfasst: Freitag 12. Juni 2009, 16:37
von Braindie
Danke für eure Tipps.

Die Umsetzung von PEP8 wird wohl bei mir am längsten dauern.

Gruss Stefan