【问题标题】:KeyError with Python dictionaryPython字典的KeyError
【发布时间】:2015-08-25 15:33:45
【问题描述】:

我一直在使用 ><> (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

【问题讨论】:

  • 您也应该添加导致问题的代码吗?以及相同的完整回溯。
  • 另外,您应该让我们知道您的输入/输出是什么。
  • 请举例说明您的输入内容。
  • @AnandSKumar 抱歉,添加了回溯和输入。

标签: python debugging interpreter keyerror


【解决方案1】:

几个问题 -

  1. 您没有考虑最后一行,因为您的范围是 - for x in range(0,length-1): - 并且范围的 stop 参数是专有的,所以它不会转到 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 
    

    你应该从 0 开始 cmdy 。好像你把它们都颠倒了。

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

你会想要使用类似的东西

cmd = prgm[x][y]

第一部分 prgm[x] 将访问作为字典中 x 键值的列表,然后 [y] 将从列表中提取第 y 个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多