else声明嵌套元组有麻烦

时间:2019-04-30 16:21:48

标签: python-3.x

我已经在这个问题上工作了几天,需要帮助来理解为什么我的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']

很显然,它在数字和错误之间循环了太多次,但我不知道为什么。请帮忙。

1 个答案:

答案 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')]