Hallo!
Wie kann ich überprüfen, ob es einen Schlüssel in einem Dictionary gibt?
Grüße, pktm
Dict-Schlüssel auf Existenz überprüfen
Bei Keys ists schnell gemacht
Bei den Values musst du auch über d.values() suchen
Code: Alles auswählen
>>> d = {1:"eins",2:"zwei"}
>>> 1 in d
True
>>>"eins" in d
False
Code: Alles auswählen
>>> "eins" in d.values()
True
Ansonsten noch über die Methode has_key()
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)
Ich denke, damit sind alle Möglichkeiten angesprochen
MfG EnTeQuAk
Code: Alles auswählen
>>> d = {1:"eins", 2:"zwei"}
>>> d.has_key(1)
True
Code: Alles auswählen
>>> d.get(3, "gibet nicht")
'gibet nicht'
MfG EnTeQuAk
- 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!)
Interessant zu wissen. Gleich mal meine Anwendungen entsprechend überarbeitenWobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Also: einfach das hey_key() Beispiel ein wenig übersehen *g*
MfG EnTeQuAK
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 ...)birkenfeld hat geschrieben:Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
Dank für die Info,
Christian
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".
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".
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
1.) Langsamer weils einen Method Call durchführen mussCM hat geschrieben: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 ...)birkenfeld hat geschrieben:Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
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
- 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:
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
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
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 ...
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
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.CM hat geschrieben: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 ...)birkenfeld hat geschrieben:Wobei has_key deprecated ist und nicht mehr verwendet werden sollte. (Es ist auch langsamer!)
In Python 3.0 wird es dann has_key nicht mehr geben; 2.6 mit der "Py3k-Warn-Option" wird dann auch warnen.