Syntaxproblem Dictionary mit Listen

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
akratellio
User
Beiträge: 4
Registriert: Mittwoch 4. Juli 2007, 08:57

Mittwoch 4. Juli 2007, 09:06

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Mittwoch 4. Juli 2007, 09:27

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
Zuletzt geändert von veers am Mittwoch 4. Juli 2007, 09:34, insgesamt 2-mal geändert.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Mittwoch 4. Juli 2007, 09:33

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
BlackJack

Mittwoch 4. Juli 2007, 09:55

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.
akratellio
User
Beiträge: 4
Registriert: Mittwoch 4. Juli 2007, 08:57

Mittwoch 4. Juli 2007, 10:09

Vielen Dank für die schnellen Antworten!

Viele Grüße

akratellio
Antworten