Walking/Iteration über ein verschachteltes dictionary beliebiger Tiefe (das Wörterbuch stellt einen Verzeichnis-Baum)

Ich bin mir fast sicher es gibt eine einfache Lösung für dieses, aber ich habe Stunden damit zugebracht haben, jetzt das Lesen und Wiederlesen der gleichen Gruppe von verwandten Ergebnissen, die nicht ganz die Antwort mein problem.

Zusammenhang mit dieser Frage (im Lieferumfang enthalten, ist für den Abschluss, aber fühlen Sie sich frei, zu überspringen)

Dies kam, weil ich ein Benutzer in der Lage sein, wählen Sie eine Gruppe von Dateien in einem Verzeichnis (und auch jedem Unterverzeichnis), und leider Tkinter Standard-Fähigkeit für die Auswahl mehrerer Dateien im dialog Datei defekt ist auf Windows 7 (http://bugs.python.org/issue8010).

So, ich bin versucht zu repräsentieren, eine Verzeichnis-Struktur durch eine alternative Methode (immer noch mit Tkinter): konstruieren eines Faksimile der directory-Struktur, hergestellt, gekennzeichnet und eingerückt Checkboxen (organisiert in einem Baum). Damit ein Verzeichnis wie dieses:

\SomeRootDirectory
    \foo.txt
    \bar.txt
    \Stories
        \Horror
            \scary.txt
            \Trash
                \notscary.txt
        \Cyberpunk
    \Poems
        \doyoureadme.txt

wird in etwa so Aussehen (wobei # für ein checkbutton):

SomeRootDirectory
    # foo.txt
    # bar.txt
    Stories
        Horror
            # scary.txt
            Trash
                # notscary.txt
        Cyberpunk
    Poems
        # doyoureadme.txt

Gebäude das ursprüngliche Wörterbuch, aus der Verzeichnis-Struktur ist einfach, mit einem Rezept fand ich bei ActiveState (siehe unten), aber ich traf eine Wand, wenn ich versuche zu iterieren über die schön verschachtelten dictionary bin ich Links mit. Und ich glaube, ich muss Durchlaufen, um füllen Sie eine Tkinter-Rahmen mit einer ziemlich gerasterte Darstellung des Baumes. Dann hoffe ich die Last in den verschiedenen text-Dateien, die der Benutzer ausgewählt, durch die Interpretation, die Checkboxen waren true oder false. Alles scheint ziemlich einfach, mit Ausnahme der Iteration über das Wörterbuch ohne Befestigung der Tiefe.

In abstrakteren Begriffen

Machen diese verschachtelten dictionaries bin ich mit einer ActiveState-Rezept -- http://code.activestate.com/recipes/577879/. Es setzt os.Spaziergang zu machen-Wörterbücher wie diese:

a={
    'SomeRootDirectory': {
        'foo.txt': None,
        'bar.txt': None,
        'Stories': {
            'Horror': {
                'horror.txt' : None,
                'Trash' : {
                    'notscary.txt' : None,
                    },
                },
            'Cyberpunk' : None
            },
        'Poems' : {
            'doyoureadme.txt' : None
        }
    }
}

Nach dem Punkt bin ich ratlos. Ich bin ein Python Neuling zum Zeitpunkt des Schreibens

Angepasste Lösung aus spicavigo Antwort

#distinguish between directory and file
dirtab = "/==="
filetab = "|---"

Parents={ -1:"Root"}
def add_dir(level, parent, index, k):
    print (dirtab*level)+k
def add_file(level, parent, index, k):
    #Currently an empty folder gets passed to add_file; here's a quick treatment.
    if "." in k:
        print (filetab*level)+k
    else:
        print (dirtab*level)+k
def addemup(level=0, parent=-1, index=0, di={}):
    for k in di:
        index +=1
        if di[k]:
            Parents[index]=k
            add_dir(level, parent, index, k)
            addemup(level+1, index, index, di[k])
        else:
            add_file(level, parent, index, k)

addemup(di=a) #dictionary from above

Dadurch entsteht etwas, dass ich denke, dass wird sehr leicht zu überarbeiten, in ein Tkinter-Darstellung:

SomeRootDirectory
/===Poems
|--- | ---doyoureadme.txt
/===Stories
/===/===Horror
|--- | --- | ---rickscott.txt
/===/===/===Trash
|--- | --- | --- | ---notscary.txt
/===/===Cyberpunk
|---foo.txt
|---bar.txt

Dank, dieser Gemeinschaft ist unglaublich.

  • wenn Sie Durchlaufen Wörterbuch-Schlüssel-Wert-Paare (innerhalb einer Funktion, die dictionary als argument), können Sie prüfen, ob der Wert eines dictionary-Typs, wenn ja, dann rufen Sie Ihre Funktion wieder verwenden, d.h. die Rekursion hier und pass den Wert als ein Wörterbuch, um die Funktion, andere Prozess den Wert.. dies sollte zu lösen die variable Tiefe iteration problem
InformationsquelleAutor hangtwenty | 2011-10-12
Schreibe einen Kommentar