Brauche Hilfe beim Codeverständnis mit Dictionaries

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

Montag 17. November 2008, 13:20

Hi,

ich versuche gerade ein Programm umzuschreiben, aber ich habe hier ein kleines Verständnisproblem.

Erstmal eine Kurzzusammenfassung der Methode, um die es hier geht:

Es werden Verzeichnisse nach Files von bestimmten Typen durchsucht, diese werden dann geprüft und sollen in ein dictionary geschrieben werden (Das ganze Programm importiert Daten aus einer gegebenen Dateistruktur in die von einer anderen Applikation benoetigten Struktur).

Nun mein Problem:

Es wird zu Beginn eine Variable squences (ein dictionary) deklariert, ich verstehe aber den Mechanismus, wie diese mit Inhalt versorgt wird nicht.

Code: Alles auswählen

  
    sequences = {} # das besagte dictionary

    def issupported( fn ): # closure
        for e in extensions:
            if fn.endswith(e):
                return True
        return False

    # get the files from all roots, create the sequences
    for srcdn in map(normpath, root_dirs):
        lsrc = len(srcdn)+1
        for root, dirs, files in os.walk(srcdn, topdown=True):
            relroot = root[lsrc:]

            for fn in files:
             
                if not issupported(fn):
                    continue
                mo = heure.search(fn)
                if mo:
                    key = fn[:mo.start(1)] + \
                          markchar * len(mo.group(1)) + \
                          fn[mo.end(1):]
                else:
                    key = fn
                key = join(relroot, key)
                # hier ein beispiel fuer einen Key wert:
                # tmp\v11\2048x1556\078_filename.####.jpg


                if key not in sequences:
                    continue
                else:
                    assert key != fn
                # hier steige ich dann aus...
                # Ich denke es werden zwei neue dicts erzeugt (r und l), 
                # die dann mit dem inhalt von sequences beschrieben werden
                # sequences bekommt als Vorgabe fuer den Schluesselwert 
                # ein Tupel aus dem Übergeordneten Ordner zugewiesen, nur 
                # verstehe ich die [] in der Zuweisung nicht
                r, l = sequences.setdefault(key, (srcdn, []))
                # an l wird der relative rootname und der Filename    
                ä angehaengt
                l.append(join(relroot, fn))

        for k in sequences.keys():
             # und so weiter...

Ich verstehe nicht, wie sequences zu seinen Werten kommt und was es genau mit .setdefault(key(srcdn,[]) auf sich hat.

Ich bin für jede Hilfe dankbar!!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Montag 17. November 2008, 13:55

Wie du richtig vermutet hast, ist setdefault dafür verantwortlich. Was setdefault tut, steht in der Python-Doku
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Montag 17. November 2008, 14:04

Code: Alles auswählen

setdefault(key[, default]):  
If key is in the dictionary, return its value.
If not, insert key with a value of default and return default. default defaults to None.
D.h., wenn key nicht in sequences ist, wird

Code: Alles auswählen

r, l = sequences[key] = (srcdn, [])
ansonsten

Code: Alles auswählen

r, l = sequences[key]
ausgeführt. Da Zeile 42 aber nur erreicht wird, wenn key in sequences ist, kann man auch gleich

Code: Alles auswählen

r, l = sequences[key]
schreiben. Das Füllen des Dicts müsste dann irgendwo anders erfolgen. Sinn würde Zeile 42 nur machen ohne Zeile 33. Hast Du den Code evtl. irgendwie verändert oder uns wichtige Teile vorenthalten?
MfG
HWK
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

Montag 17. November 2008, 14:18

Vielen Dank, schonmal. Ich habe am Code nichts verändert und alles so übernommen. Schon möglich, dass der ursprüngliche Entwickler ein bisschen "gepennt" hat.

Allerdings ist mir noch nicht ganz klar, was der Ausdruck '[]' in den Klammern für eine Funktion hat.
BlackJack

Montag 17. November 2008, 14:26

Das ist eine literale Liste.

Code: Alles auswählen

In [85]: []
Out[85]: []

In [86]: type([])
Out[86]: <type 'list'>
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

Montag 17. November 2008, 15:55

Okay, dann funktioniert das Ganze also so, dass der Wert von key als Schluessel für sequences verwendet wird, r sozusagen den Wert srcdn besitzt und das [] durch l repräsentiert wird, dem dann in der folgenden Zeile ein Wert zugewiesen wirde.

In sequences steht dann ein Gebilde, dass fuer jedes Feld aussieht wie:

key : ('C:\\temp', [irgendwas.img])

...gar nicht so leicht drauf zu kommen.

Danke!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Montag 17. November 2008, 20:40

Code: Alles auswählen

for k in sequences.keys():
besser

Code: Alles auswählen

for k in sequences:
MfG
HWK
Antworten