функция автозаполнения с Python dict - PullRequest
5 голосов
/ 03 июня 2010

В PHP у меня была эта строка matches = preg_grep('/^for/', array_keys($hash)); Что бы он сделал, он бы взял слова: fork, form и т. Д., Которые находятся в $ hash.

В Python у меня есть диктат с 400 000 слов. Его ключи - это слова, которые я хотел бы представить в функции автозаполнения (значения в этом случае не имеют смысла). Как мне вернуть ключи из моего словаря, которые соответствуют вводу?

Например (как раньше), если у меня есть

my_dic = t{"fork" : True, "form" : True, "fold" : True, "fame" : True}

и я получаю некоторый ввод "for", он вернет список "fork", "form".

Ответы [ 5 ]

6 голосов
/ 03 июня 2010
>>> mydict={"fork" : True, "form" : True, "fold" : True, "fame" : True}
>>> [k for k in mydict if k.startswith("for")]
['fork', 'form']

Это должно быть быстрее, чем использование регулярного выражения (и достаточно, если вы просто ищете начала слова).

3 голосов
/ 03 июня 2010

Так что это не прямой ответ на ваш вопрос, а ..

Похоже, вы действительно не хотите диктовать подобные вещи, вы ищете древовидную структуру, верно?

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

1 голос
/ 03 июня 2010

Если вам нужна определенная стратегия поиска (например, «начальные с 3-мя символами», описанные выше), вы, вероятно, сможете быстро выиграть, создав специальный словарь поиска, основанный на этой идее.

q = {"fork":1, "form":2, "fold":3, "fame":4}
from collections import defaultdict
q1 = defaultdict(dict)
for k,v in q.items():
    q1[k[:3]][k]=v

Это позволит вам выполнить поиск типа .startswith в гораздо меньшем наборе

def getChoices(frag):
    d = q1.get(frag[:3])
    if d is None:
        return []
    return [ k for k in d.keys() if k.startswith(frag) ]

Надеюсь, это будет намного быстрее, чем обработка целых 400 000 ключей.

1 голос
/ 03 июня 2010
>>> my_dict = {"fork" : True, "form" : True, "fold" : True, "fame" : True}
>>> import re
>>> [s for s in my_dict if re.search('^for', s) is not None]
['fork', 'form']

Использование регулярных выражений является более универсальным, поскольку вы можете предоставить более сложные шаблоны поиска, если речь идет только о префиксах, вы можете использовать строковые методы: str.startwith, например:

>>> [s for s in my_dict if s.startswith('for')]
['fork', 'form']
0 голосов
/ 03 июня 2010

Вы можете получить ключи от my_dict с помощью my_dict.keys ().Затем вы можете выполнить поиск по каждому ключу, чтобы увидеть, соответствует ли оно вашему регулярному выражению.

m = re.compile('^for')
keys = []
for key in my_dict.keys():
   if m.match(key) != None:
      keys.append(key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...