Prüfen, ob ein bestimmter Schlüssel bereits in einem Wörterbuch existiert
Um eine Vorstellung davon zu bekommen, wie das geht, sehen wir uns zunächst an, welche Methoden wir im Wörterbuch aufrufen können.
Hier sind die Methoden:
d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Python Dictionary clear() Removes all Items
Python Dictionary copy() Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys() Creates dictionary from given sequence
Python Dictionary get() Returns Value of The Key
Python Dictionary items() Returns view of dictionary (key, value) pair
Python Dictionary keys() Returns View Object of All Keys
Python Dictionary pop() Removes and returns element having given key
Python Dictionary popitem() Returns & Removes Element From Dictionary
Python Dictionary setdefault() Inserts Key With a Value if Key is not Present
Python Dictionary update() Updates the Dictionary
Python Dictionary values() Returns view of all values in dictionary
Die brutale Methode, um zu prüfen, ob der Schlüssel bereits existiert, kann die get()
método:
d.get("key")
Die beiden anderen interessant Methoden items()
y keys()
klingt nach zu viel Arbeit. Lassen Sie uns also untersuchen, ob get()
ist die richtige Methode für uns. Wir haben unser Diktat d
:
d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Der Druck zeigt, dass der Schlüssel, den wir nicht haben, zurückkommt None
:
print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1
Auf diese Weise erhalten wir die Information, ob der Schlüssel vorhanden ist oder nicht. Wenn wir aber ein Diktat mit einem einzigen key:None
:
d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None
Führend in diesem get()
Methode ist nicht zuverlässig, wenn einige Werte möglicherweise None
.
Diese Geschichte sollte ein glücklicheres Ende haben. Wenn wir die in
Komparator:
print('key' in d) #True
print('key2' in d) #False
Wir erhalten die richtigen Ergebnisse.
Wir können den Python-Bytecode untersuchen:
import dis
dis.dis("'key' in d")
# 1 0 LOAD_CONST 0 ('key')
# 2 LOAD_NAME 0 (d)
# 4 COMPARE_OP 6 (in)
# 6 RETURN_VALUE
dis.dis("d.get('key2')")
# 1 0 LOAD_NAME 0 (d)
# 2 LOAD_METHOD 1 (get)
# 4 LOAD_CONST 0 ('key2')
# 6 CALL_METHOD 1
# 8 RETURN_VALUE
Dies zeigt, dass in
ist nicht nur zuverlässiger, sondern auch schneller als get()
.
31 Stimmen
Aufruf von
dict.keys()
erstellt eine Liste von Schlüsseln, entsprechend der Dokumentation docs.python.org/2/library/stdtypes.html#dict.keys aber es würde mich überraschen, wenn dieses Muster in einer seriösen Implementierung nicht so optimiert wäre, dass es sich inif 'key1' in dict:
.7 Stimmen
So habe ich endlich herausgefunden, warum viele meiner Python-Skripte so langsam waren :) :(. Das liegt daran, dass ich seit Jahren
x in dict.keys()
um nach Schlüsseln zu suchen. Und das geschah, weil die übliche Art, in Java über Schlüssel zu iterieren, istfor (Type k : dict.keySet())
diese Gewohnheit verursachtfor k in dict.keys()
sich natürlicher anfühlen alsfor k in dict
(was in Bezug auf die Leistung immer noch in Ordnung sein sollte?), aber dann wird die Überprüfung der Schlüssel zuif k in dict.keys()
auch, was ein Problem ist...4 Stimmen
@EvgeniSergeev
if k in dict_:
prüft auf das Vorhandensein von k in den KEYS von dict_, so dass Sie immer noch nicht brauchendict_.keys()
. (Das hat mich gestört, denn es liest sich für mich wie ein Test für ein Wert in dict. Ist es aber nicht.)1 Stimmen
@ToolmakerSteve Das stimmt, aber das ist nicht nur unnötig, sondern auch keine gute Praxis.
26 Stimmen
Versuchen Sie "Diktat eintippen".