二进制搜索字符串列表中的字符串

时间:2016-09-20 10:05:00

标签: python python-3.x binary-search

我有一个字符串排列列表,以及一个充满词典单词的列表。我想为每个排列找出它是否在单词列表中。我尝试了一个while循环,只是暴力强迫通过,这给了我一些单词列表中的单词。但是当我尝试这种二分法搜索时:

def binärSökning(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

我没有得到任何回报,只是一个空列表(只是假,如果它返回true,它将该词添加到另一个列表)。任何人都可以告诉我为什么当它碰到一个好词时它没有回归真实?

编辑: 什么叫这个函数只是一个for循环:

foundWords = set()

for word in listOfWords:
    if binärSökning(word, NewWordList):
        foundWords.add(word)

return foundWords

NewWordList是一个较窄的可能单词列表,它没有任何问题,因为它在我尝试暴力时起作用。

我想要的结果是,当搜索函数返回true时,for循环将该单词添加到一个集合中,然后在程序完成后呈现给用户。

2 个答案:

答案 0 :(得分:0)

这对我来说很好。以下是我的代码:

def binrSkning(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

以下是我的输出

>>> binrSkning('hi', ['hello', 'hi', 'how'])
True
>>> binrSkning('tim', ['hello', 'hi', 'how'])
False

以下对我来说很好:

>>> NewWordList = ['hello', 'hi', 'how']
>>> listOfWords = ['hi', 'how', 'bye']
>>> foundWords = set()
>>> for word in listOfWords:
        if binrSkning(word, NewWordList):
            foundWords.add(word)

>>> foundWords
set(['how', 'hi'])

答案 1 :(得分:0)

如果你有一个单词列表,就像制作单个if语句一样简单:

def bomrSkning(word, wordList):
    found = False
    if word in wordList:
        found = True
    return found