Dictionary in Dictionary

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
sirisunshine
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 09:59

Hey Leute ich hab da mal n ziemliches Problem,

Ich habe ein Dictionary in einem Dictionary erstellt:

Beispiel:

Code: Alles auswählen

dict = {'Sieger': { 'Klaus': '14', 'Inge': '18', 'Walter' : '20', 'Jürgen' : '19'}}
Nun würd ich das gerne in einer Datei speichern (cat)

Ich will dass das ganze ungefähr so abgespeichert wird:

Code: Alles auswählen

<Sieger>; <Klaus>; <Walter>; <Jürgen>
Ihr seht also, nicht alle Leute aus dem inneren Dictionary werden aufgelistet aber wichtig ist mir, dass erst der Key 'Sieger' erscheint und danach durch ; getrennt nur 'Klaus': '14' und z.B. 'Jürgen' : '19' als value.

Könnt ihr mir helfen?
Zuletzt geändert von Hyperion am Donnerstag 1. Mai 2014, 08:04, insgesamt 1-mal geändert.
Grund: Code in Code-Tags gesetzt.
BlackJack

@sirisunshine: Warum willst Du selber irgendein Format erfinden und nutzt nicht etwas schon vorhandenes? JSON würde sich anbieten. Ist verbreitet, hat ein Modul in der Standardbibliothek, und man kann es damit auch einfach wieder einlesen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Woher kommt deine Anforderung an das Format der Datei und anhand welcher Tatsache soll das Programm entscheiden, welche Keys ausgegeben werden (warum ist "Inge" nicht dabei?).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dazu käme noch die Frage, *wie* das ursprüngliche DIctionary wirklich aussieht. Wenn das äußere Dict lediglich ein Key-Value-Paar umfasst ("Sieger" und dazu das Dict mit den Siegern), ist es imho ziemlich sinnlos und man könnte das eher so codieren:

Code: Alles auswählen

sieger = {'Klaus': '14', 'Inge': '18', ...}
@sirisunshine: Wo liegt denn das konkrete Problem bei der Umformung? Eigentlich ist es doch nur eine Schleife und das Zusammenbauen von einem String... das ist an sich ja nicht wirklich schwierig.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sirisunshine
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 09:59

Danke für die schnelle Hilfe Leute. Habs mittlerweile selbst hingekriegt. Bin noch neu hier und sollte echt mal drauf achten dass ich n bisschen genauer ins Detail gehe.

Also zu dem Dict in Dict nochmal und das ganze als .cat Datei für die weiterverarbeitung.

Das ganze sieht nochmal so aus:

Code: Alles auswählen

Dict = {{'Sieger': {'Inge': '24', 'Klaus': '18', 'Peter': '19', 'Viktor': '18', 'Johannes': '17', 'Jürgen': '29'},      {'Verlierer': {'Inge': '19', 'Klaus': '12', 'Peter': '17', 'Viktor': '18', 'Johannes': '12', 'Jürgen': '19'},.........
Also wie Ihr seht is das n riesen Ding weil da kommen noch 100 andere Keys wie: Sieger, Verlierer, Schiedsrichter, Zuschauer......... und zu jedem Key ca. 6 Values die in dem Dict im Dict sitzen sprich 'Inge':'19', 'Klaus': '12',......

Und nun wollte ich nur bestimmte Namen( Inge, Peter, Johannes) und Werte(19, 17, 12) zu den Keys(Sieger, Verlierer...) haben und das ganze als ordenliche Liste in einer .cat Datei haben.

Das ganze hab ich mit ner String formatierung gelöst:

Code: Alles auswählen

fobj_out = open("Output.cat","w")

for key in Dict.iterkeys():

       fobj_out.write(key +';{0};{1};{2}'.format( Dict[key]['Inge'],
                                           Dict[key]['Peter'],
                                           Dict[key]['Johannes']+"\n"))

       print  key +';{0};{1};{2}'.format( Dict[key]['Inge'],
                                           Dict[key]['Peter'],
                                           Dict[key]['Johannes'])

fobj_out.close()
Das wars. Hoff Ihr habts jetzt n bisschen verstanden.

Tschööööööööööööööööööö
BlackJack

@sirisunshine: Was ist eine ``*.cat``-Datei? Für mich sieht das nach CSV aus.

Warum teilst Du die String-Formatierung so komisch auf, also warum wird der `key` da anders behandelt als die anderen Werte? Warum ist der '\n' nicht im Template sondern wird nachträglich ”angehängt”? (Anhängen kann man ja nichts, da wird extra eine neue Zeichenkette erzeugt.)

Wenn man Schlüssel *und* Wert braucht, dann kann man auch gleich über die Schlüssel/Wert-Paare iterieren.

Dateien sollte man nach möglichkeit mit der ``with``-Anweisung zusammen öffnen. Dann ist man sicher, das die Datei beim Verlassen des ``with``-Blocks auch garantiert geschlossen wird.

Einrücktiefe ist per Konvention vier Leerzeichen pro Ebene.

Code: Alles auswählen

import csv

# ...

    data = {}
    names = ['Inge', 'Peter', 'Johannes']
    with open('Output.cat', 'wb') as cat_file:
        writer = csv.writer(cat_file, delimiter=';')
        for key, value in data.viewitems():
            values = [key]
            values.extend(value[name] for name in names)
            writer.writerow(values)
Antworten