Будет ли этот код работать эффективно для поиска слов в словаре на основе случайных вводимых букв?

1

Я новичок в кодировании. Я попытался создать простой код, который может принимать подмножество букв алфавита и возвращать действительные слова из текстового словаря.

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

Теперь мой вопрос - это лучший способ сделать это с точки зрения производительности, длины кода и последовательности блоков? Если нет, можете ли вы предложить лучший способ сделать это?

#Read the dictionary

fh = open('C:\\english-dict2.txt')
dict = []
while True:
    line = fh.readline()
    dict.append(line.strip())
    if not line:
        break
fh.close()

#Input letters

letters = input("Please enter your letters: ")
letters_list=[]
for l in letters:
    letters_list.append(l)
mini = 2 #default value
maks = len(letters_list)
mini = input("Minimum length of the word (default is 2): ")

if mini == "":
    mini = 2 #default value
mini = int(mini)

#Here I create a new dictionary based on the number of letters input or less than.

newdic=[]

for words1 in dict:
    if len(words1) <= maks and len(words1)>= mini:
        newdic.append(words1)

for words2 in newdic:
    ok = 1

    for i in words2:
        if i in letters_list:
            ok = ok * 1
        else:
            ok = ok * 0

    if ok == 1:
        print(words2)
Теги:
python-3.x

3 ответа

0
Лучший ответ

Списки неэффективны для поиска. Вы должны использовать dict наборов вместо того, чтобы индексировать каждое слово с каждой буквой в слове, так что вы можете просто использовать set intersection, чтобы найти слова, которые содержат все указанные буквы:

from functools import reduce
d = {}
with open('C:\\english-dict2.txt') as f:
    for l in f:
        w = l.strip()
        for c in set(w):
            d.setdefault(c, set()).add(w)
letters = input("Please enter your letters: ")
print(reduce(lambda a, b: a & d[b], letters[1:], d[letters[0]]))

Например, учитывая словарь следующих слов:

apple
book
cat
dog
elephant

Индексный словарь d стал бы:

{'p': {'elephant', 'apple'}, 'a': {'cat', 'elephant', 'apple'}, 'l': {'elephant', 'apple'}, 'e': {'elephant', 'apple'}, 'k': {'book'}, 'b': {'book'}, 'o': {'book', 'dog'}, 'c': {'cat'}, 't': {'cat', 'elephant'}, 'd': {'dog'}, 'g': {'dog'}, 'h': {'elephant'}, 'n': {'elephant'}}

Здесь пример ввода/вывода вышеуказанного кода, в котором найдены слова " apple и " elephant, содержат как буквы a и e:

Please enter your letters: ae
{'apple', 'elephant'}

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

  • 1
    Вау, я впечатлен этим аккуратным решением! Впервые слышал о лямбде. Время вернуться к учебе и больше практиковаться. Спасибо.
0

Для вашего словаря вам не нужно выполнять итерацию с помощью readline(), просто выполните:

with open(path) as fh:
    dict = readlines()

Это также безопасно закроет ваш файл, даже если есть ошибка. Если вы хотите выполнять поиск слов, я бы использовал set а не list, так как поиски в sets - это O (1), в то время как поиск в list - нет, они O (n).

d_set = set(dict)

Таким образом, если вы хотите создать все комбинации букв, вы можете посмотреть их так:

import itertools

letters = input("Input your letters, please ")


def check_for_match(combos):
    for combo in combos:
        if combo in d_set:
            yield combo

i = len(letters)

my_list = []

while i:
    combos = itertools.permutations(words, i)
    results = list(check_for_match(combos))
    my_list = [*my_list, *results]
    i-=1

Это даст вам все перестановки letters, проверьте, находятся ли они в вашем словаре, и постройте my_list если они есть. Я думаю, что то, что вы ищете

0

модификация 1: вам не нужно зацикливать буквы letters, просто

letters_list=list(letters)

достаточно, чтобы составить список букв.

modify2: вы можете убедиться, что любой mini можно обрабатывать, используя:

try:
    mini = int(mini)
except:
    mini = 2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню