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:

Dienstag 6. März 2007, 21:25

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 6. März 2007, 22:20

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

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

Dienstag 6. März 2007, 23:22

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:

Dienstag 6. März 2007, 23:25

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:

Dienstag 6. März 2007, 23:28

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

Mittwoch 7. März 2007, 00:27

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 7. März 2007, 13:33

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:

Mittwoch 7. März 2007, 16:09

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