我已经在这个问题上工作了几天,需要帮助来理解为什么我的else语句不起作用。任务是构建一个词法分析器,该词法分析器将返回一个单词及其类型,该类型基于包含所有可接受的单词及其类型的元组。如果单词不在元组中,则应该返回类型为“错误”的单词。
我已经尝试使用any()扫描元组中的所有对,如果返回false,则打算插入else语句。如果返回true,则应该“通过”并继续for循环。
我已经研究过使用枚举和列表理解功能-但我仍然是一个初学者,无法将我的头放在任何一个将如何使用int()检查中。
adv_input = [('direction', 'north'),
('verb', 'go'),
('verb', 'kill'),
('stop', 'the'),
('number', 91234)]
def convert_number(s):
try:
return int(s)
except ValueError:
return None
def scan(input):
r = []
stuff = input.split()
for word in stuff:
for pair in adv_input:
if word in pair:
r.append((pair[0], word))
elif convert_number(word) in pair:
r.append((pair[0], convert_number(word)))
elif any(word in pair for pair in adv_input):
pass
else:
r.append(('error', word))
return(r)
scan("north go kill 91234 hello")
我的实际结果:
[('direction', 'north'), ('verb', 'go'), ('verb', 'kill'), ('error', '91234'), ('error', '91234'), ('error', '91234'), ('error', '91234'), ('number', 91234), ('error', 'hello'), ('error', 'hello'), ('error', 'hello'), ('error', 'hello'), ('error', 'hello')]
预期结果:
[('direction', 'north'), ('verb', 'go'), ('verb', 'kill'), ('number', 91234), ('error', 'hello']
很显然,它在数字和错误之间循环了太多次,但我不知道为什么。请帮忙。
答案 0 :(得分:0)
只要条件匹配,您只需要将break
移出内部for循环。看看我在下面的代码中有4条break
语句
adv_input = [('direction', 'north'),
('verb', 'go'),
('verb', 'kill'),
('stop', 'the'),
('number', 91234)]
def convert_number(s):
try:
return int(s)
except ValueError:
return None
def scan(input):
r = []
stuff = input.split()
for word in stuff:
for pair in adv_input:
if word in pair:
r.append((pair[0], word))
break
elif convert_number(word) in pair:
r.append((pair[0], convert_number(word)))
break
elif any(word in pair for pair in adv_input):
pass
else:
r.append(('error', word))
break
return(r)
print(scan("north go kill 91234 hello"))
现在输出变为
[('direction', 'north'), ('verb', 'go'),
('verb', 'kill'), ('error', '91234'), ('error', 'hello')]