2016-04-17 10 views
2

Wie kann ich am kürzesten Weg nach einem bestimmten Schlüssel/Wert-Paar in einem Wörterbuch suchen, wenn ich nicht weiß, dass der Schlüssel existiert?Überprüfen, ob ein Schlüssel/Wert-Paar in einem Python-Wörterbuch vorhanden ist

Bisher hat ich kam mit:

if 'key' in my_dict and my_dict['key'] == 'value': 
    do_something() 

Das ist wirklich lange mit längeren Variablennamen oder mehr Schlüssel/Wert-Namen, wie zum Beispiel:

if 'X-Powered-By' in self.request.headers and self.request.headers['X-Powered-By'] == 'NodeBB': 
    do_something() 

Was für einen kürzerer Weg, auf das Vorhandensein eines Schlüssels und eines entsprechenden Wertes prüfen?

Antwort

7

Sie können den Wert, holen und vergleichen Sie es sofort:

# default return value is None if key is not found 
if mydict.get("key") == "somevalue" 

oder

# Or specify your own default value 
if mydict.get("key", False) == "somevalue" 

Python dict.get docs Check-out.

+0

Danke, waren Sie die erste Antwort, und das ist kürzer als Apero Antwort suchen. Ich werde das akzeptieren, wenn ich kann. –

-1

Ok, mein Vorschlag, den Code besser lesbar zu machen:

headers = self.request.headers 
if headers.get('X-Powered-By') == 'NodeBB': 
    do_something() 

Diese ein weiterer kurzer Code sein könnte, aber auf jeden Fall nicht effizient als dict.get:

if ('X-Powered-By', 'NodeBB') in self.request.headers.items(): 
    do_something() 
+1

Ja, das habe ich selbst gedacht :) –

+1

Das funktioniert. Es missachtet jedoch die wahre Macht eines "Diktats". Die anderen Lösungen sind "O (1)", das ist "O (N)"! – schwobaseggl

+1

@Apero Ich habe deine Antwort aufgefrischt, da es um die Prägnanz ging, nicht um die Geschwindigkeit. Ich werde nie mit großen Diktaten zu tun haben, also ist Geschwindigkeit nicht entscheidend. Ich schätze deine Antwort. (das ist auch etwas, an das ich dachte, ich habe nach alternativen Lösungen gesucht). Ich werde Davor Lucics Lösung immer noch akzeptieren, da sie kürzer ist, aber ich habe kein Problem mit der langsameren Antwort. –

2

Eigentlich keines Die Antworten erfassen das vollständige Problem. Wenn der Wert, nach dem abgefragt wird, zufällig None ist oder welcher Standardwert auch immer angegeben wird, schlagen die get() -basierten Lösungen fehl. Das Folgende ist möglicherweise die am allgemeinsten anwendbare Lösung, die nicht auf Standardwerten beruht, die Existenz eines Schlüssels tatsächlich prüft (im Gegensatz zu get()) und nicht übersteuert KeyError s (anders als die andere try-except Antwort), während immer noch O(1)dict verwendet wird Lookup (im Gegensatz zu items() Ansatz):

try: 
    assert my_dict[key] == value: 
except (KeyError, AssertionError): 
    do_sth_else() # or: pass 
else: 
    do_something() 
0

Wenn Sie gerade die Existenz des Schlüssels

if not 'key' in my_dict: 
    my_dict['key'] = 'some default value' 
Verwandte Themen