подобная автоматическому заполнению функция с Python dict

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

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

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

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

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

5
задан SilentGhost 3 June 2010 в 16:48
поделиться

5 ответов

>>> mydict={"fork" : True, "form" : True, "fold" : True, "fame" : True}
>>> [k for k in mydict if k.startswith("for")]
['fork', 'form']

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

6
ответ дан 13 December 2019 в 19:22
поделиться
>>> 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']

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

>>> [s for s in my_dict if s.startswith('for')]
['fork', 'form']
1
ответ дан 13 December 2019 в 19:22
поделиться

Если вам нужна конкретная стратегия поиска (например, «начинается с 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
ответ дан 13 December 2019 в 19:22
поделиться

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

m = re.compile('^for')
keys = []
for key in my_dict.keys():
   if m.match(key) != None:
      keys.append(key)
0
ответ дан 13 December 2019 в 19:22
поделиться

Это не прямой ответ на ваш вопрос, но...

Похоже, что вам не нужен дикт для такого рода вещей, вам нужна древовидная структура, верно?

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

3
ответ дан 13 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: