2017-09-03 5 views
1

は今、私はアセンブラをコーディングしようとしているが、私はこのエラーを取得しておいてください。辞書を操作する際に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) 

ヘルプが理解されます。

+0

あなたはインデントが正しいかどうかをダブルチェックできますか?私はコードとしてそれをフォーマットしましたが、それが望ましいインデントであるかどうかは常に分かりません。 :) – MSeifert

+1

ちょっと脇に...範囲(16)で 'nのための' valueTable = {str(n):format(n、 '04b')} 'を実行できます。 /ペーストエラーをコピーするか、そうでない場合は不正な値と少ない画面スペースを入力するには... –

答えて

5

あなたは一般的にループは次のようになり、デフォルト

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.

そうで.getを使用します。

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方法は、コードが短く、より速くなりますので、私は実際には後者の方法を使用することはありません。なぜあなたのコードが失敗したのかを指摘するだけでした。

+0

MSeifert、そんなにありがとう:D –

0

registerTableにはキー 'LD' はありません。ブロック以外試みを置くことができます。印刷され

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

:あなたはgetを使用する場合

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

あなたは潜在的なキーitemitemで辞書に中に存在するかどうかを調べています。テストで参照を削除するだけで済みます。

if item in functionTable: 
    ... 

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

あなたが「00」に項目、またはデフォルトを検索しようとするように見えます。 Pythonの辞書には、値を取得しようとする関数.get(key, default)が組み込まれています。

試してみてください。

functionField = functionTable.get(item, '00') 
registerField = registerTable.get(item, '00') 
関連する問題