dict.update vs schleife

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
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Komischer Titel... naja, die Frage die ich damit aufwerfen will:

Wenn ich Daten habe, die in einem Dictionary sind, gibt es da einen Unterschied zwischen diesen beiden Konstruktionen hier:

Code: Alles auswählen

for key in dictionary:
    if dictionary.has_key(key):
        if dictionary[key] != newdata[key]: dictionary[key] = newdata[key]
    else:
        dictionary[key] = newdata[key]
und

Code: Alles auswählen

dictionary.update(newdata)
??
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, das Verhalten ist schon unterschiedlich.

Du interiest nämlich in der Schleife über dictionary und nicht über newdata. Somit landen nur die Keys im bestehenden dict, wenn diese vorher auch schon da waren ;)
Die IF Abfrage macht aber IMHO keinen Sinn. OK man spart sich ein paar Zuweisungen, wenn der Wert vorher schon der selbe ist, das erkauft man sich allerdings mit einigen Prüfungen.

Das Verhalten von update dürfte IMHO das selbe wie das sein:

Code: Alles auswählen

for k,v in newdata.iteritems():
    dictionary[k] = v

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Warum musst du den Unterschied wissen?

Gruss
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

jens hat geschrieben:Die IF Abfrage macht aber IMHO keinen Sinn. OK man spart sich ein paar Zuweisungen, wenn der Wert vorher schon der selbe ist, das erkauft man sich allerdings mit einigen Prüfungen.
Oh doch, dass macht Sinn. Hat naemlich das zu aktualisierende Dictionary den Key noch nicht, wuerde sonst ein KeyError geschmissen werden.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

rayo hat geschrieben:Hi

Warum musst du den Unterschied wissen?
Gruss
Hi Rayo...

weil ich sicherstellen wollte, dass die Aktualisierung der Daten so performant und sicher wie Moeglich laeuft.
Soll heißen: Fehlt ein Key, muss er hinzugefuegt werden. Besteht der Key, soll er aktualisiert werden, falls es unterschiede gibt.

Das alles sollte auch bei großen Dictionarys noch gut laufen.

Allerdings muss ich das inzwischen nicht mehr fuer mein Projekt wissen. Doch interessieren wuerde mich das trotzdem noch ;)

Gruss zurueck...

EDIT:*ditsch* Sorry fuer den Doppelpost ^^
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

Dann ist bedingungslos überschreiben immer schneller als vorher zu testen ob sich die Daten geändert haben, weil dabei einfach mehr gemacht wird. Man spart dabei nicht wirklich etwas. Und noch schneller als das "selbst" zu tun ist die `update()`-Methode, da dort die Schleife in C geschrieben ist und wahrscheinlich nicht unnötige Tupel erzeugt werden.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

nkoehring hat geschrieben:
jens hat geschrieben:Die IF Abfrage macht aber IMHO keinen Sinn. OK man spart sich ein paar Zuweisungen, wenn der Wert vorher schon der selbe ist, das erkauft man sich allerdings mit einigen Prüfungen.
Oh doch, dass macht Sinn. Hat naemlich das zu aktualisierende Dictionary den Key noch nicht, wuerde sonst ein KeyError geschmissen werden.
Nein, wenn der Key noch nicht vorhanden ist, wird er einfach neu erzeugt. Das gitl natürlich nur, wenn man deine "Optimierung" wegläßt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Ja gut... "Optimierung" ^^

Logisch, wenn man einfach sagt, fuer jeden Key, der da ist: alt[key] = neu[key], dann ist mir das klar...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten