【问题标题】:NameError: name is not defined, even when I define the name [duplicate]NameError:未定义名称,即使我定义了名称[重复]
【发布时间】:2018-01-19 10:56:54
【问题描述】:

我正在编写一个程序,它使用 BoyerMoore 算法解析与文本匹配的模式的文本。我设法让代码找到所有匹配项,并打印出匹配项的位置。

现在我也尝试获取 match_table 的长度和比较次数。我对python很不熟悉,程序告诉我“NameError:名称'comparison'没有定义,即使它在def boyer_moore中使用。 该程序显然不会保存变量以供以后使用。如果这听起来令人困惑,我很抱歉,我对 python 很陌生。匹配的文本可以是found here

def make_bad_match_table(pattern):

length = len(pattern)
table = {}
for i, c in enumerate(pattern):
    if i == length-1 and not c in table:
        table[c] = length
    else:
        table[c] = length - i - 1

return table




def boyer_moore(pattern, text):
    comparison = 0
    match_table = []
    pattern_length = len(pattern)
    text_length = len(text)
    if pattern_length > text_length:
        return match_table

    table = make_bad_match_table(pattern)
    index = pattern_length - 1
    pattern_index = pattern_length - 1

    while index < text_length:
        if pattern[pattern_index] == text[index]:
            if pattern_index == 0:
                match_table.append(index)
                pattern_index = pattern_length - 1
                index += (pattern_length * 2 - 1)
                comparison +=1
            else:
                pattern_index -= 1
                index -= 1
        else:
            index += table.get(text[index], pattern_length)
            pattern_index = pattern_length - 1

    return match_table
    return comparison

if __name__ == '__main__':

    file = open("CNN.txt", "r")
    target = file.read()
    pattern = "NASA"
    print(pattern,boyer_moore(pattern, target))
    print(len(match_table))
    print(comparison)

【问题讨论】:

  • comparison 仅在 boyer_moore 中定义,因此是该函数的本地函数,但您尝试在其他地方调用它

标签: python algorithm defined


【解决方案1】:

1.首先代替

return match_table
return comparison

只是做

return (match_table, comparison)

2. 而不是这个:

print(pattern,boyer_moore(pattern, target))
print(len(match_table))
print(comparison)

只是做:

 match_table, comparsion = boyer_moore(pattern, target)
 print(pattern)
 print(comparison, len(match_table))

希望它现在可以帮助你。

【讨论】:

    【解决方案2】:

    您也不能在 return 语句之后有一个语句,因此您必须在 boyer_moore 函数的末尾删除一个返回。

    return match_table
    return comparison
    

    【讨论】:

    • 你是对的,第二个return 从未遇到过,但基本上这不是问题
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 2020-06-17
    • 2016-07-06
    • 2015-10-22
    • 2016-05-12
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多