Verifique se uma chave já existe em um dicionário
Para ter uma idéia de como fazer isso, primeiro inspecionamos quais métodos podemos chamar no dicionário. Aqui estão os métodos:
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
O método brutal para verificar se a chave já existe pode ser o get()
método:
d.get("key")
Os outros dois métodos interessantesitems()
e keys()
parecem muito trabalho. Então, vamos examinar se get()
é o método certo para nós. Temos o nosso ditado d
:
d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
A impressão mostra a chave que não temos retornará None
:
print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1
Nós podem usar isso para obter a informação se a chave está presente ou não. Mas considere isso se criarmos um ditado com um único key:None
:
d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None
Liderar esse get()
método não é confiável, caso alguns valores possam ser None
. Esta história deve ter um final mais feliz. Se usarmos o in
comparador:
print('key' in d) #True
print('key2' in d) #False
Nós obtemos os resultados corretos. Podemos examinar o código de bytes do Python:
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
Isso mostra que o in
operador de comparação não é apenas mais confiável, mas ainda mais rápido que get()
.
dict.keys()
cria uma lista de chaves, de acordo com a documentação docs.python.org/2/library/stdtypes.html#dict.keys, mas eu ficaria surpreso se esse padrão não fosse otimizado para, em uma implementação séria, traduzir paraif 'key1' in dict:
.