Como evitar o erro-chave ao trabalhar com dicionários?
Traceback (most recent call last): File "/Users/Douglas/Documents/NeWS.py", line 44, in if item in registerTable[item]: KeyError: 'LD'
tenho este código:
functionTable = {"ADD":"00",
"SUB":"01",
"LD" :"10"}
registerTable = {"R0":"00",
"R1":"00",
"R2":"00",
"R3":"00"}
accumulatorTable = {"A" :"00",
"B" :"10",
"A+B":"11"}
conditionTable = {"JH":"1"}
valueTable = {"0":"0000",
"1":"0001",
"2":"0010",
"3":"0011",
"4":"0100",
"5":"0101",
"6":"0110",
"7":"0111",
"8":"1000",
"9":"1001",
"10":"1010",
"11":"1011",
"12":"1100",
"13":"1101",
"14":"1110",
"15":"1111"}
source = "LD R3 15"
newS = source.split(" ")
for item in newS:
if item in functionTable[item]:
functionField = functionTable[item]
else:
functionField = "00"
if item in registerTable[item]:
registerField = registerTable[item]
else:
registerField = "00"
print(functionField + registerField)
Agradeço a ajuda.
3 answers
Geralmente usa .get
com um valor por omissão
get(key[, default])
Devolve o valor da chave se a chave estiver no dicionário, caso contrário, por omissão. Se o padrão não for dado, ele usa por omissão nenhum, de modo que este método nunca levanta um KeyError.
Então, quando você usa {[5] } o laço seria assim:
for item in newS:
functionField = functionTable.get(item, "00")
registerField = registerTable.get(item, "00")
print(functionField + registerField)
Que imprime:
1000
0000
0000
Se você quiser fazer a verificação explícita se a chave está no dicionário você tem que verificar se a chave está em o dicionário (sem indexação!).
Por exemplo:
if item in functionTable: # checks if "item" is a *key* in the dict "functionTable"
functionField = functionTable[item] # store the *value* for the *key* "item"
else:
functionField = "00"
Mas o método get
torna o código mais curto e mais rápido, então eu não usaria a última abordagem. Só queria dizer porque é que o teu código falhou.
Não há nenhuma chave 'LD' no registerTable. Pode tentar excepto num bloco:
try:
a=registerTable[item]
...
except KeyError:
pass
Você está olhando para ver se a chave potencial item
existe no dicionário em item
. Você simplesmente precisa remover a pesquisa no teste.
if item in functionTable:
...
Ainda que isto pudesse ser melhorado.
Parece que você tenta procurar o item, ou por omissão para '00'. Os dicionários de Python têm a função .get(key, default)
incorporada para tentar obter um valor, ou por omissão para algo mais.
Tenta:
functionField = functionTable.get(item, '00')
registerField = registerTable.get(item, '00')