web-dev-qa-db-ja.com

辞書を使用してKeyErrorを回避するにはどうすればよいですか?

現在、アセンブラーをコーディングしようとしていますが、このエラーが発生し続けます。

トレースバック(最新の呼び出しが最後):
 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)

ヘルプは大歓迎です。

12
Wigan Pier

通常は _.get_ をデフォルトで使用します

get(key[, default])

Keyが辞書にある場合はkeyの値を返し、そうでない場合はデフォルトを返します。デフォルトが指定されていない場合は、デフォルトで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メソッドはコードをより短く、より速くするので、実際には後者のアプローチを使用しません。コードが失敗した理由を指摘するだけでした。

29
MSeifert

RegisterTableにはキー「LD」はありません。ブロック以外のtryを配置できます:

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

潜在的なキーitemが辞書のitemに存在するかどうかを確認しています。テストでルックアップを削除するだけです。

_if item in functionTable:
    ...
_

これは改善される可能性もありますが。

アイテムを検索しようとしているようです。デフォルトは「00」です。 Python辞書には、値を取得しようとする、またはデフォルトで他の何かに設定するための組み込み関数.get(key, default)があります。

試してください:

_functionField = functionTable.get(item, '00')
registerField = registerTable.get(item, '00')
_
1
Kyle P