dictionary.update() - Frage zur Reihenfolge

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
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

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:

Code: Alles auswählen

telbuch["peter"].update({"fax":"555/54321"})
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
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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])
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

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).

Code: Alles auswählen

while z < len(telbuch["peter"].keys())
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

Code: Alles auswählen

telbuch["peter"].keys()[z]
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 :cry:
nochmal danke für eure hilfe
to.ni
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Zuletzt geändert von wuf am Montag 17. Mai 2004, 19:08, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Zuletzt geändert von wuf am Montag 17. Mai 2004, 19:09, insgesamt 1-mal geändert.
Take it easy Mates!
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

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 :-)
Antworten