使用for循环进行二进制搜索,在列表中搜索单词并进行比较

时间:2018-12-16 03:05:27

标签: python algorithm search binary-search

我正在尝试将“ alice_list”和“ dictionary_list”中的单词进行比较,如果在“ dictionary_list”中找不到单词以进行打印,并说可能是拼写错误。我遇到的问题是,如果找不到它,它不会打印任何内容,也许你们可以帮帮我。我将“ alice_list”附加到大写字母,因为“ dictionary_list”全部用大写字母表示。当我要拔掉头发时,对它为什么不起作用的任何帮助将不胜感激!

       import re
    # This function takes in a line of text and returns
    # a list of words in the line.

    def split_line(line):
        return re.findall('[A-Za-z]+(?:\'[A-Za-z]+)?', line)
    # --- Read in a file from disk and put it in an array.

    dictionary_list = []
    alice_list = []
    misspelled_words = []

    for line in open("dictionary.txt"):
        line = line.strip()
        dictionary_list.extend(split_line(line))

    for line in open("AliceInWonderLand200.txt"):
        line = line.strip()
        alice_list.extend(split_line(line.upper()))


    def searching(word, wordList):
        first = 0
        last = len(wordList) - 1
        found = False
        while first <= last and not found:
            middle = (first + last)//2
            if wordList[middle] == word:
                found = True
            else:
                if word < wordList[middle]:
                    last = middle - 1
                else:
                    first = middle + 1
        return found


    for word in alice_list:
        searching(word, dictionary_list)

---------工作的编辑代码---------- 如果有人遇到同样的问题,请更新一些内容,并使用“ for word not in”仔细检查搜索中输出的内容。

"""-----Binary Search-----"""
# search for word, if the word is searched higher than list length, print
words = alice_list
for word in alice_list:
        first = 0
        last = len(dictionary_list) - 1
        found = False
        while first <= last and not found:
            middle = (first + last) // 2
            if dictionary_list[middle] == word:
                found = True
            else:
                if word < dictionary_list[middle]:
                    last = middle - 1
                else:
                    first = middle + 1
                if word > dictionary_list[last]:
                    print("NEW:", word)

# checking to make sure words match
for word in alice_list:
    if word not in dictionary_list:
        print(word)

2 个答案:

答案 0 :(得分:1)

您的函数split_line()返回一个列表。然后,您将获取函数的输出并将其附加到词典列表中,这意味着词典中的每个条目都是单词的 list 而不是单个单词。快速解决方法是使用extend代替append

    dictionary_list.extend(split_line(line))

与此处的列表相比,集合可能是更好的选择,那么您就不需要二进制搜索。

-编辑-
要打印不在列表中的单词,只需根据函数是否返回False来过滤列表。像这样:

notfound = [word for word in alice_list if not searching(word, dictionary_list)]

答案 1 :(得分:1)

您是否需要对该程序使用二进制搜索? Python有一个方便的运算符,称为“ in”。给定一个元素作为第一个操作数,并给它一个列表/集合/字典/元组作为第二个操作数,如果该元素在结构中,则返回True,否则返回false。

示例:

1 in [1, 2, 3, 4] -> True
"APPLE" in ["HELLO", "WORLD"] -> False

因此,对于您而言,大多数脚本可以简化为:

for word in alice_list:
    if word not in dictionary_list:
        print(word)

这将打印不在词典列表中的每个单词。