【问题标题】:How do I avoid KeyError when working with dictionaries?使用字典时如何避免 KeyError?
【发布时间】:2018-02-11 22:54:34
【问题描述】:

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

回溯(最近一次通话最后): 文件“/Users/Douglas/Documents/NeWS.py”,第 44 行,在 如果在 registerTable[item] 中的项目: 键错误:'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)

感谢您的帮助。

【问题讨论】:

  • 您能否再次检查缩进是否正确?我将其格式化为代码,但总是很难确定这是否是所需的缩进。 :)
  • 顺便说一句...你可以这样做valueTable = {str(n):format(n, '04b') for n in range(16)} - 这样更容易更改范围,更不容易出现复制/粘贴错误或以其他方式输入不正确的值和更少的屏幕空间...

标签: python dictionary keyerror


【解决方案1】:

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

if item in functionTable:
    ...

虽然这甚至可以改进。

您似乎尝试查找该项目,或默认为“00”。 Python 字典有内置函数.get(key, default) 来尝试获取一个值,或者默认为其他值。

试试:

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

【讨论】:

    【解决方案2】:

    您通常使用 .get 和默认值

    get(key[, 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 方法使代码更短更快,所以我实际上不会使用后一种方法。只是为了指出您的代码失败的原因。

    【讨论】:

      【解决方案3】:

      registerTable 中没有键 'LD'。可以试试除了块:

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

      【讨论】:

        猜你喜欢
        • 2021-01-28
        • 2017-10-19
        • 1970-01-01
        • 2014-09-08
        • 2018-10-26
        • 2021-02-01
        • 1970-01-01
        • 2012-12-16
        • 2018-08-11
        相关资源
        最近更新 更多