Python字典的KeyError

时间:2015-08-25 15:33:45

标签: python debugging interpreter keyerror

我一直在><> (Fish)翻译练习,而且我遇到了一个错误。有问题的代码似乎在这里:

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

输入是来自wiki页面的hello world程序:

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

2 个答案:

答案 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,但在您的for循环中(如上所述),您只是在字典中启动索引来自1。所以你应该从1开始定义。示例 -

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

    您应该从cmdy开始0。好像你让他们两个都逆转了。

答案 1 :(得分:0)

你想要使用像

这样的东西
cmd = prgm[x][y]

第一部分prgm [x]将访问列表,该列表是字典中x键的值,然后[y]将从列表中拉出第y个元素。