Найти возможное слово по известным буквам и положению букв - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь найти слово по его известным буквам и позициям букв (аналогично кроссворду), аналогично тому, что делает crosswordsolver.org

Пример:

input: 
B E _ K

possible words: 
BEAK
BECK
BELK
BERK

У меня естьвсе возможные слова (одинаковой длины) в списке.проблема в том, что я не могу найти правильное решение для сравнения user_input с моим списком.

Сравнение каждого индекса каждого слова в словаре с буквами слов user_input кажется решением, однако оно вообще неэффективно.

Есть ли другой способ решения этой проблемы?

заранее благодарю

РЕДАКТИРОВАТЬ: я должен добавить, что регулярное выражение не может быть использовано в качестве решения, потому что я работаю с персидскими (фарси) словами, которые используют персидский алфавит (похожий на арабский)

Ввод пользователя осуществляется буквенно и сохраняется как список.Возможно, пропущено более 1 буквы, а длина слова может быть от 1 до 10

.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Я предлагаю вам построить дерево с вашим списком слов.

*-+-A
  |
  +-B-+-A
  |   |
      +-B
      |
      +-C
      |
      +-C
      |
      +-E-+-A-+
      |   |   |
              .
              .
              |
              +-K-x ("BEAK")

Поиск будет быстрым и потребление памяти будет низким.

Если вы не хотите начинать с нуляВы можете использовать модуль anytree.

0 голосов
/ 14 сентября 2018

Быстрый взлом

# Save pattern as (char, position) where position starts at 0
pattern = [("B", 0), ("E", 1), ("K", 3)] 

dictionary = ["BEAK", "BECK", "BELK", "BERK"]

def match(word, pattern):
    if len(pattern) > len(word):
        return false

    return all(word[pos] == c for (c, pos) in pattern):

def list_matches(pattern, dictionary):
    for word in dictionary:
        if match(word, pattern):
            print(word)

list_matches(pattern, dictionary)

Вы можете использовать Trie структуру данных, и это будет намного эффективнее.

0 голосов
/ 14 сентября 2018

Посмотрите на пакет регулярных выражений

Что-то как:

import re
pattern = re.compile('BE.K')
possible_words = [word for word in all_words if re.match(pattern, word)]

будет работать.

...