Seite 1 von 1
dictionary.update() - Frage zur Reihenfolge
Verfasst: Sonntag 16. Mai 2004, 11:28
von to.ni
hallo zusammen,
habe da ein kleines problem, bzw. eine frage. ich habe ein dictionary, welches weitere dictionarys enthält, etwa so:
Code: Alles auswählen
telbuch = {"peter":{"handy":"01555/12345","festnetz":"555/12345"}}
das wäre soweit ein telefonbuch, wobei jetzt nur peter mit einer handy-nummer und einer festnetz-nummer eingetragen ist.
zu meiner frage:
nun möchte ich eine faxnummer hinzufügen, was ja grundsätzlich kein problem ist:
das problem ist jetzt, dass die faxnummer im peter-dictionary ganz vorne steht. sie sollte aber hinten stehen, da die reihenfolge wichtig ist...
wisst ihr, wie ich das machen könnte?
danke für eure hilfe
to.ni
Verfasst: Sonntag 16. Mai 2004, 11:49
von fs111
Ich glaube das wird nicht gehen, weil der Datentyp-Dictionary nicht auf irgendwelche Reihenfolgen ausgelegt ist, dafür sind ja Listen da. Also wirst du die Sache anders angehen müssen.
fs111
Verfasst: Sonntag 16. Mai 2004, 12:16
von Milan
fs111 hat geschrieben:Ich glaube das wird nicht gehen, weil der Datentyp-Dictionary nicht auf irgendwelche Reihenfolgen ausgelegt ist, dafür sind ja Listen da. Also wirst du die Sache anders angehen müssen.
Richtig! Wenn ich dich recht verstanden habe, kommt es dir nur auf die optische Ausgabe drauf an, also musst du dir eine Funktion schreiben, die genau das bewerkstelligt, oder von Anfang an mit Listen arbeiten. Eine solche Funktion könnte zum Beispiel so aussehen:
Code: Alles auswählen
reihenfolge=["handy","festnetz","email","fax"] #halt das, was du willst
def ausgabe(d):
for i in reihenfolge:
if d.has_key(i):
print "%s : %s"%(i,d[i])
Verfasst: Sonntag 16. Mai 2004, 13:27
von to.ni
danke für eure antworten,
hmm, aber momentan weiß ich überhaupt nicht, was ich machen soll. das problem ist, dass ich die einträge des haupt-dictionarys (telbuch) in einer schleife abfrage. in der schleife kann sich der inhalt aber verändern (neue einträge hinzukommen).
dann hab ich einfach in der schleife hochgezaehlt. die schleife wurde also fuer handy und festnetz durchlaufen.
kommt in der schleife etwas hinzu, z.b. fax wird die schleife einfach einmal mehr durchlaufen.
auf die elemente von "peter" hab ich dann über den index zugegriffen
aber wenn ich jetzt in der schleife etwas hinzufügte, steht das am anfang und der zusätzliche schleifendurchlauf bezieht sich auf das letzte element (den letzten schlüssel im peter-dictionary), das ja aber eigentlich schon mal abgearbeitet wurde...
hoffe, es ist klar was ich will
nochmal danke für eure hilfe
to.ni
Verfasst: Sonntag 16. Mai 2004, 15:31
von wuf
Hallo to.ni
Es geht schon in die Richtung wie es fs111 und Milan
schon erwähnten.
Du musst die Abfragereihenfolge in einer Schlüsselliste
anlegen. Damit kannst du das zweite Dictionary des Telefon-
buches, welches für die verschiedenen Nummern-Typen bestimmt
ist, mit einem Index linear abfragen. Die Reihenfolge der
Ausgabe bestimmt nur die Schlüsselliste. Die Reihenfolge
der Eintrage im zweiten Telefonbuch-Dictionary spielt dann
keine Rolle mehr.
Das folgende Code-Beispiel soll das beweisen:
Code: Alles auswählen
#~~ Abfragereihen
reihenfolge = ['handy','festnetz','faxnummer']
#~~ Telefonbuch
telefonbuch = {'Peter': {'faxnummer':'041 100',
'festnetz' :'041 200',
'handy' :'041 300',
},
'Susanne':{'handy' :'042 100',
'festnetz' :'042 200',
'faxnummer':'042 300',
},
'Hans': {'festnetz' :'043 100',
'handy' :'043 200',
'faxnummer':'043 300',
}
}
#~~ Test der Telefonbuch-Ausgabe
print
for name in telefonbuch:
for itemkey in reihenfolge:
print itemkey +":" ,telefonbuch[name][itemkey]
print
Sorry das Einrücken wird vom Forum-Editor
nicht richtig übernommen
Gruss wuf

Verfasst: Sonntag 16. Mai 2004, 16:09
von wuf
Hallo to.ni
Sollte das zweite Telefon-Dictionary für die Nummern nicht
immer die gleiche Anzahl Schlüssel aufweisen muss natürlich
für die Ausgabe der Nummerdaten der Code noch wie folgt
ergänzt werden:
Code: Alles auswählen
for itemkey in reihenfolge: # Bestehend
if telefonbuch[name].has_key(itemkey): # Ergänzung
print itemkey +":" ,telefonbuch[name][itemkey] # Bestehend
Gruss wuf

Verfasst: Montag 17. Mai 2004, 17:39
von to.ni
hallo nochmal,
danke für eure hilfe, nach einiger zeit hab ich es auch kapiert
nochmal als lösung, falls dieses thema später jemanden interessiert:
eine schleife soll so oft durchlaufen werden, wie es schlüssel im dictionary "peter" gibt. jedoch können im schleifen-durchlauf zusätzliche schlüssel ins dic aufgenommen werden.
um dennoch alle schlüssel des "peter"-dictionary zu erfassen werden die schlüssel sowohl im dictionary als auch in einer zusätzlichen liste (eintraege) gespeichert.
anschließend greift man auf das dictionary mit hilfe der liste zu.
Code-Beispiel:
Code: Alles auswählen
telbuch = {"peter":{"handy":"123"}}
eintraege = ['handy']
neu_fax = true
neu_festnetz = true
#In der Schleife wird der Eintrag von Peter dynamisch um eine festnetz- und eine faxnummer erweitert, die schleife wird also 3 mal durchlaufen, obwohl zu beginn nur eine nummer vorhanden ist
while z < len(eintraege):
print "peter: "
print eintraege[z] + ": " telbuch["peter"][eintraege[z]]
if neu_fax == true:
telbuch["peter"].update({"fax":"321"})
eintraege.append("fax")
if neu_festnetz == true:
telbuch["peter"].update({"festnetz":"567"})
eintraege.append("festnetz")
wie gesagt, der trick besteht einfach darin (wie auch in vorherigen antworten schon erwähnt) den neu aufzunehmenden schlüssel zusätzlich in einer liste zu speichern, da in der liste die einträge so stehen, wie sie eingetragen wurden.
mit den zusätzlichen code-beispielen aus diesem thema kommt glaube ich jeder auf eine lösung mit einem ähnlichen problem.
nochmal danke an alle!
to.ni
