Sprawdź, czy dany klucz już istnieje w słowniku
Aby dowiedzieć się, jak to zrobić, najpierw sprawdzamy, jakie metody możemy wywołać w słowniku. Oto metody:
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
Brutalna metoda sprawdzenia, czy klucz już istnieje, może być następującą get()
metodą:
d.get("key")
Pozostałe dwie interesujące metody items()
i keys()
brzmią jak zbyt dużo pracy. Sprawdźmy więc, czy get()
jest to dla nas właściwa metoda. Mamy nasz dyktand d
:
d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Drukowanie pokazuje, że klucz, którego nie mamy, powróci None
:
print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1
My może używać, aby uzyskać informacje, czy klucz jest obecny lub nie. Ale rozważ to, jeśli utworzymy dyktat z jednym key:None
:
d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None
Prowadzenie tej get()
metody nie jest wiarygodne w przypadku, gdy niektóre wartości mogą być None
. Ta historia powinna mieć szczęśliwsze zakończenie. Jeśli użyjemy in
komparatora:
print('key' in d) #True
print('key2' in d) #False
Otrzymujemy prawidłowe wyniki. Możemy zbadać kod bajtowy Pythona:
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
To pokazuje, że in
operator porównania jest nie tylko bardziej niezawodny, ale nawet szybszy niż get()
.
dict.keys()
tworzy listę kluczy, zgodnie z dokumentacją docs.python.org/2/library/stdtypes.html#dict.keys, ale zdziwiłbym się, gdyby ten wzorzec nie został zoptymalizowany pod kątem poważnej implementacji do przetłumaczenia doif 'key1' in dict:
.