Seite 1 von 1

Dict-Schlüssel auf Existenz überprüfen

Verfasst: Dienstag 12. Juni 2007, 10:56
von pktm
Hallo!

Wie kann ich überprüfen, ob es einen Schlüssel in einem Dictionary gibt?

Grüße, pktm

Verfasst: Dienstag 12. Juni 2007, 11:01
von Zap
Bei Keys ists schnell gemacht

Code: Alles auswählen

>>> d = {1:"eins",2:"zwei"}
>>> 1 in d
True
>>>"eins" in d
False
Bei den Values musst du auch über d.values() suchen

Code: Alles auswählen

>>> "eins" in d.values()
True

Verfasst: Dienstag 12. Juni 2007, 11:27
von EnTeQuAk
Ansonsten noch über die Methode has_key()

Code: Alles auswählen

>>> d = {1:"eins", 2:"zwei"}
>>> d.has_key(1)
True
Man kann auch dictionary.get(key) verwenden, wo man einen default Wert definieren kann, der zurückgegeben wird, fals der Schlüssel nicht existiert (default ist None)

Code: Alles auswählen

>>> d.get(3, "gibet nicht")
'gibet nicht'
Ich denke, damit sind alle Möglichkeiten angesprochen ;)


MfG EnTeQuAk

Verfasst: Dienstag 12. Juni 2007, 14:10
von birkenfeld
Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)

Verfasst: Dienstag 12. Juni 2007, 15:53
von EnTeQuAk
Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Interessant zu wissen. Gleich mal meine Anwendungen entsprechend überarbeiten ;)

Also: einfach das hey_key() Beispiel ein wenig übersehen *g*


MfG EnTeQuAK

Verfasst: Dienstag 12. Juni 2007, 19:07
von CM
birkenfeld hat geschrieben:Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Ja, interessant - hast Du eine Quelle? Ich habe gerade gegoogelt und auch Hinweise darauf gefunden, aber keine wirklich zuverlässige Quelle. (Manchmal ärgert mich bei Python, daß Funktionalität, die "deprecated" deklariert wird, keine Warnung gibt, wenn man sie aufruft ...)

Dank für die Info,
Christian

Verfasst: Dienstag 12. Juni 2007, 20:06
von BlackJack
Quelle habe ich auch nicht, aber eine Erklärung: Der ``in``-Operator leistet das gleiche, ist schneller und funktioniert auch mit anderen Container-Objekten die in der Regel keine `has_key()`-Methode haben. Ausserdem finde ich die Schreibweise mit ``in`` lesbarer.

Wenn man bedenkt wie oft Dictionaries benutzt werden, dürfte eine Menge "alter" Code so eine Warnung hervorrufen. Ich würde ungern alten Quelltext nur umschreiben, weil er eine Methode benutzt die man jetzt "anders formuliert".

Verfasst: Mittwoch 13. Juni 2007, 07:24
von mitsuhiko
CM hat geschrieben:
birkenfeld hat geschrieben:Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Ja, interessant - hast Du eine Quelle? Ich habe gerade gegoogelt und auch Hinweise darauf gefunden, aber keine wirklich zuverlässige Quelle. (Manchmal ärgert mich bei Python, daß Funktionalität, die "deprecated" deklariert wird, keine Warnung gibt, wenn man sie aufruft ...)
1.) Langsamer weils einen Method Call durchführen muss
2.) birkfenfeld weiß das, weil er AFAIR diese Funktionalität selber entfernt hat ;)
3.) http://www.python.org/dev/peps/pep-3100/

Verfasst: Mittwoch 13. Juni 2007, 08:53
von Michael Schneider
Hi,

dazu steht auch was in PEP 290
http://www.python.org/dev/peps/pep-0290/

Außerdem könnte ich mir auch vorstellen, dass eine Exception gewünscht ist, um die Auswertung abzubrechen und das Problem weiter außen oder einfach nur ausführlicher zu behandeln:

Code: Alles auswählen

>>> def ausgabe(d, k):
...     try:
...         print d[k]
...     except KeyError:
...         print "Schluessel", k, "ist noch nicht vorhanden."
...         d[k] = raw_input("neuer Wert: ")
...         print d[k]
... 
>>> d = {}
>>> ausgabe(d, "zahl")
Schluessel zahl ist noch nicht vorhanden.
neuer Wert: 15
15
>>> ausgabe(d, "zahl")
15
Das ist ein ziemlich sinnfreies Beispiel, da es um die Struktur ging.

Außerdem, wenn die get-Methode mal einen Wert aus dem Wertebereich des Dictionaries zurückgibt, kann man nachher nicht mehr unterscheiden, ob es der Wert zum gesuchten Schlüssel ist, oder der Defaultwert.

Grüße,
Michael

Verfasst: Mittwoch 13. Juni 2007, 11:57
von birkenfeld
CM hat geschrieben:
birkenfeld hat geschrieben:Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Ja, interessant - hast Du eine Quelle? Ich habe gerade gegoogelt und auch Hinweise darauf gefunden, aber keine wirklich zuverlässige Quelle. (Manchmal ärgert mich bei Python, daß Funktionalität, die "deprecated" deklariert wird, keine Warnung gibt, wenn man sie aufruft ...)
Es ist sozusagen "soft deprecated" im Sinne von "in neuem Code nicht mehr verwenden". has_key verwenden noch soviele alte Pakete, dass eine Warnung sehr lästig würde, wie BlackJack schon sagte.

In Python 3.0 wird es dann has_key nicht mehr geben; 2.6 mit der "Py3k-Warn-Option" wird dann auch warnen.