Datenstrukturen Dict of Dict || Dict of List || List of Dict

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
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Hallo,

bei meinen ersten Schritten mit Python versuche ich verschiedene
Perl-Programme umzuschreiben. Einfach um zu sehen, ob ich es mit Python auch hinbekomme.

Ich habe hier EPG-Daten aus einer Datei, in einen Hash eingelesen.
Perl: pro Sendung eine Zuweisung

Code: Alles auswählen

$tv{$Channel}{$Time} = [$Duration,$Title,$Subtitle, $Description]
Da in Python eh nur mit Referenzen gearbeitet wird, sollte es kein Problem sein, dies umzusetzen.

Meine ersten Versuche sind ins Stocken geraten.

Code: Alles auswählen

tv_dic = {Sender:{Startzeit:[Dauer,Sendung,Titel,Beschreibung]}}
Wie sollte eine Klasse aussehen, die alle Sender mit deren Sendungen aufnehmen kann?

Oder anders: Wie erstelle ich eine Liste von Objekten und wie gehe ich damit um?

Mir ist nicht klar, wie ich das händeln kann.

Gruß P.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

So zum Beispiel gehts:

Code: Alles auswählen

def set_epg_data(data, channel, time, *values):
    try:
        data[channel][time] = values
    except KeyError:
        #wird ausgeführt wenn es der erste eintrag für diesen channel ist
        data[channel] = {time:values}

tv = {}
set_epg_data(tv, channel, time, duration, title, subtitle, description)
Gruss

*edit* Namen der MEthode geändert
BlackJack

Das ist es glaube ich noch nicht so ganz, weil man dann nur eine Sendung am Tag pro Kanal haben kann. ;-)

Der Unterschied zu Perl ist, das bei Python nicht einfach Objekte automatisch "aus dem Nichts" erzeugt werden. Das im äusseren Dictionary ein weiteres für die Zeiten erzeugt werden soll, kann der Python-Interpreter nicht wissen. Man könnte ja auch ganz andere Objekte dort haben wollen.

Die Perl-Zuweisung lässt sich am einfachsten so übertragen:

Code: Alles auswählen

    tv = dict()
    tv.setdefault(channel, dict())[time] = (duration,
                                            title,
                                            subtitle,
                                            description)
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Hallo,

danke erst einmal. Ich schau mal, ob ich es nachvollziehen kann.

Code: Alles auswählen

tv = {}
wird die Klasse.

Code: Alles auswählen

set_epg_data(data, channel, time, *values)
wird die Methode, welche mein Objekt mit Daten füllt.
Werde ich testen. Objektorientiert arbeiten ist für mich neu.
Wie bilde ich aus den vielen Objekten eine Kollektion, wo ich gezielt Daten herausziehen kann?
Sagen wir mal: Alle Sendungen des ZDF, die nach 20:00Uhr anfangen und in der Beschreibung "Hirn" auftaucht?

Gruß P.
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Sorry BlackJack, war zu langsam. Schau ich mir an, danke.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi Blackjack

Ist meins nicht gleich wie deins?
Oder überseh ich jetzt was wichtiges?

Gruss
BlackJack

Mein Fehler, Deins funktioniert doch. 'Tschuldigung :oops:
BlackJack

PmanX hat geschrieben:danke erst einmal. Ich schau mal, ob ich es nachvollziehen kann.

Code: Alles auswählen

tv = {}
wird die Klasse.
Nein, das bindet den Namen `tv` an ein Dictionary-Objekt. Klassen gab's in den Beispielen von mir und rayo nicht.

Code: Alles auswählen

set_epg_data(data, channel, time, *values)
wird die Methode, welche mein Objekt mit Daten füllt.
Folglich ist das auch keine Methode sondern einfach nur eine Funktion.
Wie bilde ich aus den vielen Objekten eine Kollektion, wo ich gezielt Daten herausziehen kann?
Sagen wir mal: Alle Sendungen des ZDF, die nach 20:00Uhr anfangen und in der Beschreibung "Hirn" auftaucht?
Da schreibst Du eine Funktion für, die erst aus dem äusseren Dictionary das Dictionary für's ZDF holt, dann alle Einträge durchgeht und bei denen nach 20⁰⁰ Uhr nachschaut ob in der Beschreibung "Hirn" vorkommt.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi Blackjack

Das macht doch gar nichts, Fehler passieren, darum wollte ich meinen wissen ;)


Gruss
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Da sollte ich ja 1:1 umsetzen können, ohne überhaupt mit Objekten in Berührung zu kommen :wink:
BlackJack

Du meinst mit Klassen. Nicht mit Objekten in Berührung zu kommen geht in Python nicht. Alles ist Objekt: Zahlen, Zeichenketten, Dictionaries, Listen usw.

Und was soll eine 1:1 Umsetzung bringen? Da kommt ein Programm bei heraus, dass nicht wirklich Python ist, sondern eben Perl in Python-Verkleidung. Da kann man auch gleich das Perl-Programm benutzen.
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Klassen natürlich :!:

***Edit***
Und was soll eine 1:1 Umsetzung bringen? Da kommt ein Programm bei heraus, dass nicht wirklich Python ist, sondern eben Perl in Python-Verkleidung. Da kann man auch gleich das Perl-Programm benutzen.
Mit 1:1 meinte ich die Funktionalität.

Was meinst Du mit *nicht wirklich Python* ?
setdefault gefällt mir. An dieses "try and error" muß ich mich erst gewöhnen :)

Gruß P.
Antworten