Python 字典的 KeyError
KeyError with Python dictionary
我一直在 ><> (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
你会想要使用像
这样的东西
cmd = prgm[x][y]
第一部分 prgm[x] 将访问字典中 x 键值的列表,然后 [y] 将从列表中提取第 y 个元素。
几个问题 -
你没有考虑最后一行,因为你的范围是 - for x in range(0,length-1):
- 范围的 stop
参数是排他的,所以它不会去 length-1
。您实际上不需要获取使用范围的长度,您可以简单地使用 for i, x in enumerate(prgmlist):
。 enumerate()
在每次迭代中 returns 索引以及当前元素。
for i, x in enumerate(prgmlist, 1):
prgm[i] = list(x)
其次,从您的实际代码看来,您最初将 cmdx
定义为 0
,但在您的 for 循环中(如上所述),您只是开始1
字典中的索引。所以你应该从 1
开始定义它。例子-
stacks, str1, str2, cmdx, cmdy, face, register, cmd = {"now":[]}, 0, 0, 1, 0, "E", 0, None
你应该从 0
开始 cmdy
。好像你把它们都颠倒了。
我一直在 ><> (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
你会想要使用像
这样的东西cmd = prgm[x][y]
第一部分 prgm[x] 将访问字典中 x 键值的列表,然后 [y] 将从列表中提取第 y 个元素。
几个问题 -
你没有考虑最后一行,因为你的范围是 -
for x in range(0,length-1):
- 范围的stop
参数是排他的,所以它不会去length-1
。您实际上不需要获取使用范围的长度,您可以简单地使用for i, x in enumerate(prgmlist):
。enumerate()
在每次迭代中 returns 索引以及当前元素。for i, x in enumerate(prgmlist, 1): prgm[i] = list(x)
其次,从您的实际代码看来,您最初将
cmdx
定义为0
,但在您的 for 循环中(如上所述),您只是开始1
字典中的索引。所以你应该从1
开始定义它。例子-stacks, str1, str2, cmdx, cmdy, face, register, cmd = {"now":[]}, 0, 0, 1, 0, "E", 0, None
你应该从
0
开始cmdy
。好像你把它们都颠倒了。