Seite 1 von 1

Syntaxproblem Dictionary mit Listen

Verfasst: Mittwoch 4. Juli 2007, 09:06
von akratellio
Hallo liebe pythons,

ich habe ein kleines Problem mit der python syntax, oder genauer mit der Umsetzung meines geistigen "Höhenflugs" in python:

Also ich will aus einer Liste mit Dateinamen ein Dicitionary erzeugen welche die Dateiendung als key benutzt. Für dieses Key soll nun eine Liste aller Dateien dieser Art erzeugt werden.

Bis jetzt habe ich das:

Code: Alles auswählen

dateien = ["datei.php","datei.txt","datei1.php"]
datdic={}
for datei in dateien:
    tmpdat = datei.split('.')
    datdic[tmpdat[1]] = datei

Leider wird "natürlich" das Value immer überschrieben, da ich ja nicht weiß wie ich dem key eine Liste zuordnen kann.

Für PHP würde es so gehen:

Code: Alles auswählen

    $datdic[$tmpdat[1]][] = datei;

aber in Python....???

Vielen Dank für eure Bemühung

akratellio

Verfasst: Mittwoch 4. Juli 2007, 09:27
von veers

Code: Alles auswählen

datdic[tmpdat[1]] = datadic.get(tmpdat[1], []).append[datei]
Das ist schön kurz, hat aber den Nachteil das immer eine neue Liste erstellt wird.
So geht es schneller:

Code: Alles auswählen

try:
    datdic[tmpdat[1]].append(datei)
except KeyError:
    datdic[tmpdat[1]] = [datei]
Gruss,
Jonas

Verfasst: Mittwoch 4. Juli 2007, 09:33
von EnTeQuAk
oder:

Code: Alles auswählen

>>> for datei in dateien:
...     suffix = datei.split('.')[1]
...     if not suffix in d:
...             d[suffix] = [datei]
...     else:
...             d[suffix].append(datei)
...
>>> d
{'txt': ['datei.txt'], 'php': ['datei.php', 'datei1.php']}
MfG EnTeQuAk


€dit: kleinen fehler entfernt

Verfasst: Mittwoch 4. Juli 2007, 09:55
von BlackJack
Ab Python 2.5 kann man auch `collections.defaultdict()` benutzen:

Code: Alles auswählen

import os
from collections import defaultdict

def main():
    dateinamen = ('datei.php','datei.txt','datei1.php', 'foo.bar.txt', 'test')
    erweiterung2dateiname = defaultdict(list)
    for dateiname in dateinamen:
        erweiterung = os.path.splitext(dateiname)[1]
        erweiterung2dateiname[erweiterung[1:]].append(dateiname)
    print erweiterung2dateiname
Auf jeden Fall ist die `split()`-Lösung in den bisherigen Vorschlägen sehr fehleranfällig weil sie nicht mit Dateinamen mit mehreren oder gar keinen Punkten klar kommt.

Verfasst: Mittwoch 4. Juli 2007, 10:09
von akratellio
Vielen Dank für die schnellen Antworten!

Viele Grüße

akratellio