How do I avoid KeyError when working with dictionaries?

冷暖自知 提交于 2020-05-23 04:18:48

问题


Right now I'm trying to code an assembler but I keep getting this error:

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

I currently have this code:

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)

Help is appreciated.


回答1:


You generally use .get with a default

get(key[, default])

Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None, so that this method never raises a KeyError.

So when you use get the loop would look like this:

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

which prints:

1000
0000
0000

If you want to do the explicit check if the key is in the dictionary you have to check if the key is in the dictionary (without indexing!).

For example:

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"

But the get method makes the code shorter and faster, so I wouldn't actually use the latter approach. It was just to point out why your code failed.




回答2:


There is no key 'LD' in registerTable. Can put a try except block :

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



回答3:


You are looking to see if the potential key item exists in in dictionary at item. You simply need to remove the lookup in the test.

if item in functionTable:
    ...

Though this could even be improved.

It looks like you try to look up the item, or default to '00'. Python dictionaries has the built in function .get(key, default) to try to get a value, or default to something else.

Try:

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


来源:https://stackoverflow.com/questions/46024562/how-do-i-avoid-keyerror-when-working-with-dictionaries

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!