Как осуществить быстрый поиск по части значения словаря?
Делаю свой первый Pet-проект, поэтому вопрос возможно не очень умный.
У меня есть словарь. Ключами являются названия песен, а значениями гигантские строки с самими песнями. Я их спарсил со стороннего сайта. Теперь мне нужно, чтобы при вводе предложения программа искала по всем 600 текстам и выводила на экран абзац в котором есть это предложение или слово. Более того одно предложение может быть сразу в нескольких местах, тогда выводить нужно не первое, а случайное. Но что усложняет для меня ситуацию, нужно также вывести название песни, поэтому это словарь, а не огромная строка на все 600 рассказов.
То есть мне нужно осуществить поиск по словарю, но не целого значения, а части. Крайне желательно, чтобы это было так быстро, чтобы размышления компьютера не были заметны. Но база небольшая. 600 совсем небольших текстов.
Самая простая идея, но костыльная и полагаю медленная, это через цикл перебирать все ключи и искать в их значениях. Еще более глупая как мне кажется идея, сделать все-таки гигантскую строку, но между каждым рассказом делать одинаковую строку "НАЗВАНИЕ: название", и найдя нужную подстроку от этого индекса далее искать ближайшее "Название".
Мне кажется тут может быть хорошей идеей использовать sql или json. Поэтому вся таблица есть у меня уже в csv и json формате, но саму задачу пока не смог решить. Гуглю вокруг да около и не могу понять, как осуществить такой, кажется не сложный поиск. Спасибо.
Ответы (1 шт):
" через цикл перебирать все ключи и искать в их значениях" "Но база небольшая. 600 совсем небольших текстов." - 0.01 сек. поиск
import random, string, time, functools
t0 = time.monotonic()
DT = {''.join(random.choice(string.ascii_letters) for _ in range(10)): ''.join(
random.choice(string.ascii_letters) for _ in range(10000)) for _ in range(600)}
@functools.lru_cache(maxsize=8192)
def find(s):
for k, v in DT.items():
if s in v:
yield k, v
t = time.monotonic()
print('инит DT', t0 - t, 'сек.') # инит DT -6.468999999982770 сек.
# поиск
r = list(find('qwe'))
if r:
print('случайная', random.choice(r)) # случайная ('McUqEXVmEZ', 'geiCKWpDocZjCukWR...
print(len(r), 'шт.', time.monotonic() - t, 'сек.') # 35 шт. 0.01600000000325963 сек.