2016-09-20 3 views
-2

У меня есть список перестановок строки и список, полный слов из лексики. Я хочу, чтобы для каждой перестановки выяснялось, находится ли она в списке слов. Я пробовал цикл 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 

я не получил ничего взамен, просто пустой список (просто ложь, если она возвращает истину, он добавляет слово в другой список). Может кто-нибудь, пожалуйста, скажите мне, почему это не возвращает истину, когда она попадает в хорошее слово?

Edit: Что вызов функции просто для петли:

foundWords = set() 

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

return foundWords 

Если NewWordList является более узкий список возможных слов, это может быть, ничего плохого с ним, так как он работал, когда я попробовал грубую силу.

Что бы я хотел в результате, когда функция поиска возвращает true, цикл for добавляет это слово к набору, которое затем представляется пользователю после завершения программы.

+0

Можете ли вы добавить пример того, что у вас есть, и что вы хотели бы получить? Например. некоторые фиктивные данные, чтобы мы могли воспроизвести ваш код. –

+0

Я обновил немного больше объяснений. – Olof

+0

Это первое - и, надеюсь, последнее время я видел diaereses в имени функции. Я удивлен, что он даже работает! Для хорошего порядка, возможно, придерживайтесь букв без акцента :). –

ответ

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']) 
+0

Работает для меня, но когда я подключаю его в реальную вещь, он ничего не делает, кроме как скажет мне False. Я ничего не меняю, но это не работает. – Olof

+0

Не могли бы вы поделиться тем, что вы подключили? – Jeril

+0

Я обновил немного больше объяснений. – Olof

0

Если у вас есть список слов, это как прост как один из следующих утверждений:

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

Да, но список слов составляет около 20000 слов, так что не прошло бы времени, чтобы пройти? – Olof

+0

У вас есть слова, упорядоченные в некотором роде, чтобы быстрее их найти? Если нет, я не могу найти более быстрый метод. – Jalo

+0

Список слов упорядочен по алфавиту, если это помогает, список слов не имеет значения, в каком порядке они входят, поскольку они идут по одному в то время – Olof

 Смежные вопросы

  • Нет связанных вопросов^_^