2015-08-25 2 views
-1

Я практиковал переводчик ><> (Fish) и застрял на ошибке, которую я получаю. Проблемный код, кажется, здесь:KeyError с Python dictionary

import sys 
from random import randint 

file = sys.argv[1] 
code = open(file) 
program = code.read() 

print(str(program)) 

stdin = sys.argv[2] 
prgmlist = program.splitlines() 
length = len(prgmlist) 
prgm = {} 
for x in range(0,length-1): 
    prgm[x+1] = list(prgmlist[x]) 

целью было взять код и поместить его в своем роде сетку, так что каждая команда может быть принята и вычисляется отдельно. По сетке, я имею в виду карту к списку:

{line1:["code","code","code"] 
line2:["code","code","code"] 
line3:...} 

и так далее.

Однако, когда я пытаюсь получить команду с использованием cmd = prgm[y][x], она дает мне KeyError: 0.

Любая помощь приветствуется.

Вот отслеживающий:

Traceback (most recent call last): 
    File "/Users/abest/Documents/Python/><>_Interpreter.py", line 270, in <module> 
    cmd = prgm[cmdy][cmdx] 
KeyError: 0 

И pastebin всего кода.

вход является привет мир программа со страницы вики:

!v"hello, world"r! 
>l?!;o 
+0

Вы также должны добавить код, вызывающий проблему? Как и полная трассировка для того же самого. –

+0

Кроме того, вы должны сообщить нам, что ваш вход/выход. –

+0

Приведите примеры того, как выглядит ваш ввод. –

ответ

1

Несколько вопросов -

  1. Вы не считая последнюю строку, так как ваш диапазон - for x in range(0,length-1): - и stop аргумент диапазона Exlusive, поэтому он не идет length-1. Вам фактически не нужно использовать диапазон использования, вы можете просто использовать for i, x in enumerate(prgmlist):. enumerate() в каждой итерации возвращает индекс, а также текущий элемент.

    for i, x in enumerate(prgmlist, 1): 
        prgm[i] = list(x) 
    
  2. Во-вторых, от вашего фактического кода, кажется, как вы определяете cmdx первоначально как 0, но в вашей цикл (как указано выше), вы только начиная индекс в словаре из 1. Поэтому вы должны определить, что начиная с 1. Пример -

    stacks, str1, str2, cmdx, cmdy, face, register, cmd = {"now":[]}, 0, 0, 1, 0, "E", 0, None 
    

    И вы должны начать cmdy от 0. Похоже, вы оба перевернули.

+0

Благодарим за помощь. –

0

Вы хотите использовать что-то вроде

cmd = prgm[x][y] 

первая часть PRGM [х] будет получить доступ к списку, что это значение для ключа x в словаре, тогда [y] вытащит y-й элемент из списка.