使用词典时如何避免KeyError?

时间:2017-09-03 14:43:11

标签: python dictionary keyerror

现在我正在尝试编写汇编程序,但我不断收到此错误:

Traceback (most recent call last):
  File "/Users/Douglas/Documents/NeWS.py", line 44, in 
    if item in registerTable[item]:
KeyError: 'LD'

我目前有这段代码:

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)

非常感谢帮助。

3 个答案:

答案 0 :(得分:20)

您通常使用.get默认

  

get(key[, default])

     

如果key在字典中,则返回key的值,否则返回default。如果未给出default,则默认为None,因此此方法永远不会引发KeyError。

因此,当您使用get时,循环将如下所示:

for item in newS:
    functionField = functionTable.get(item, "00")
    registerField = registerTable.get(item, "00")
    print(functionField + registerField)

打印:

1000
0000
0000

如果要显式检查密钥是否在字典中,则必须检查密钥是否在字典中(不进行索引!)。

例如:

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"

get方法使代码更短更快,因此我实际上不会使用后一种方法。这只是为了指出你的代码失败的原因。

答案 1 :(得分:1)

没有钥匙' LD'在registerTable中。可以尝试除块:

try:
   a=registerTable[item]
      ...
except KeyError:
   pass

答案 2 :(得分:1)

您正在查看item字典中是否存在潜在关键字item。您只需删除测试中的查找。

if item in functionTable:
    ...

虽然这甚至可以改善。

看起来您尝试查找该项目,或默认为“00”。 Python词典具有内置函数.get(key, default)以尝试获取值,或默认为其他内容。

尝试:

functionField = functionTable.get(item, '00')
registerField = registerTable.get(item, '00')