2017-09-03 4 views
1

는 지금은 어셈블러 코딩하기 위해 노력하고있어하지만 난이 오류가 계속 :사전 작업시 KeyError를 피하는 방법은 무엇입니까?

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) 

도움말이 감사합니다 :

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

나는 현재이 코드가 있습니다.

+0

수 당신 퍼펙트 들여 쓰기가 맞다면? 코드로 형식을 지정했지만 원하는 들여 쓰기가되었는지 항상 명확히하는 것은 어렵습니다. :) – MSeifert

+1

그냥 옆으로 ... 범위 (16)에서'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

잠재 키 item이 사전에있는 item에 있는지 확인하려고합니다. 테스트에서 룩업을 제거하기 만하면됩니다.

if item in functionTable: 
    ... 

비록 이것이 향상 될 수도 있지만.

사용자가 항목을 찾거나 '00'으로 기본 설정되어있는 것처럼 보입니다. 파이썬 사전에는 값을 얻으려는 함수 .get(key, default)이 내장되어 있거나 다른 것을 기본값으로 사용합니다.

시도 :

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