Dict-Schlüssel auf Existenz überprüfen

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
pktm
User
Beiträge: 8
Registriert: Dienstag 9. Januar 2007, 19:18

Hallo!

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

Grüße, pktm
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
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".
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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/
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten