所以我看了类似的问题,我仍然遇到同样的问题而无法弄明白。对于这个编程任务,我正在为Clite词典的一小部分创建一个简化版本的词法分析。我正在从输入文件中提取标记,输出我的分析结果。我正在使用字典为标识符创建一个符号表。当我在不同的行上找到相同的标识符时,我需要在符号表中附加它所在的行。例如,我在第2行和第7行找到标识符“number18”。因此符号表需要从{number18:2}到{number18:2,7}
当我尝试将新行号附加到当前词典条目时出现问题。我在问题标题中发布了错误。到目前为止,这是我的代码
y = 0
s2 = ()
stable = dict()
for line in open("Sample.txt","r"):
x1 = ''
for char in line:
if char.isalpha():
x1 = x1 + char
elif char.isdigit():
x1 = x1 + char
elif char == '.':
x1 = x1 + char
elif x1 != '':
break
#print (x1)
if (x1 == "for" or x1 == "bool" or x1 == "char" or x1 == "else" or x1 == "false" or x1 == "float" or x1 == "if" or x1 == "int" or x1 == "main" or x1 == "true" or x1 == "while"):
s2=(y,"Keyword",x1)
elif x1.isidentifier():
s2=(y,"Identifier",x1)
if x1 in stable.keys():
stable[x1].append(y)
else:
stable[x1]=y
elif x1.isdigit():
s2=(y,"Int",x1)
else:
s2=(y,"Float",x1)
print (s2)
y=y+1
print (stable)
答案 0 :(得分:13)
您首先将dict
值设置为int
:
stable[x1]=y
但是稍后您尝试将其视为list
:
stable[x1].append(y)
首先使用包含您的第一个list
的{{1}}:
int
并且 stable[x1]=[y]
将有效。
或者,您可以使用defaultdict
:
.append()
然后随意附加而无需测试密钥是否已经存在:
stable = defaultdict(list)
答案 1 :(得分:4)
elif x1.isidentifier():
s2=(y,"Identifier",x1)
if x1 in stable.keys():
stable[x1].append(y)
else:
stable[x1]=y
在上面的其他部分中,您首次添加integer
。因此,下次使用append
时,您会收到该错误。
当您第一次将值添加到词典时,将整数y
包装在列表[y]
中
else:
stable[x1]=[y]
嗯,您已经从 @ Martijn的回答了解到,使用defaultdict
将是更好的选择,因为您不需要检查containment
的{ {1}}。
但是,仍然与你在dict中检查密钥的方式有关: -
key
您不需要使用if x1 in stable.keys():
,只需使用stable.keys()
,只会在stable
签到。
keys