Seite 1 von 1

dict.update vs schleife

Verfasst: Dienstag 6. März 2007, 21:25
von nkoehring
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)
??

Verfasst: Dienstag 6. März 2007, 22:20
von jens
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

Verfasst: Dienstag 6. März 2007, 23:22
von rayo
Hi

Warum musst du den Unterschied wissen?

Gruss

Verfasst: Dienstag 6. März 2007, 23:25
von nkoehring
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.

Verfasst: Dienstag 6. März 2007, 23:28
von nkoehring
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 ^^

Verfasst: Mittwoch 7. März 2007, 00:27
von 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.

Verfasst: Mittwoch 7. März 2007, 13:33
von EyDu
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.

Verfasst: Mittwoch 7. März 2007, 16:09
von nkoehring
Ja gut... "Optimierung" ^^

Logisch, wenn man einfach sagt, fuer jeden Key, der da ist: alt[key] = neu[key], dann ist mir das klar...