Como evitar o erro-chave ao trabalhar com dicionários?

Neste momento estou a tentar codificar um montador, mas continuo a ter este erro.
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.

Author: MSeifert, 2017-09-03

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.

 11
Author: MSeifert, 2017-09-03 14:53:44

Não há nenhuma chave 'LD' no registerTable. Pode tentar excepto num bloco:

try:
   a=registerTable[item]
      ...
except KeyError:
   pass
 1
Author: akp, 2017-09-03 14:53:43

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')
 1
Author: Kyle P, 2017-09-03 14:55:37