代码之家  ›  专栏  ›  技术社区  ›  tipu

使用python dict自动完成类似功能

  •  5
  • tipu  · 技术社区  · 15 年前

    在PHP中,我有这行 matches = preg_grep('/^for/', array_keys($hash)); 它将要做的是获取$hash中的单词:fork、form等。

    在python中,我有一个包含400000个单词的dict。它的关键是我想在一个自动完成的功能(在这种情况下,值是无意义的)中呈现的单词。如何从字典中返回与输入匹配的键?

    例如(如前所述),如果我有

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

    我得到一些信息 "for" ,它将返回 "fork" , "form" .

    5 回复  |  直到 15 年前
        1
  •  6
  •   Tim Pietzcker    15 年前
    >>> mydict={"fork" : True, "form" : True, "fold" : True, "fame" : True}
    >>> [k for k in mydict if k.startswith("for")]
    ['fork', 'form']
    

    这应该比使用正则表达式更快(如果您只是在寻找单词开头,这就足够了)。

        2
  •  3
  •   joshk0    15 年前

    所以这不是你所问问题的直接答案,但是……

    似乎你不想为这类事情做口述,你在找一个树形结构,对吧?

    然后,您可以为键入的每个字母(常量时间)遍历树,并将树的该部分的叶作为匹配该前缀的单词返回。

        3
  •  1
  •   SilentGhost    15 年前
    >>> 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']
    
        4
  •  1
  •   pycruft    15 年前

    如果您想要一个特定的查找策略(如上面概述的“startswith 3 chars”),您可以通过基于该思想创建一个特定的查找字典来快速获得胜利。

    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) ]
    

    希望这比处理整个400000个密钥要快得多。

        5
  •  0
  •   Donald Miner    15 年前

    你可以用我的dict.keys()从我的dict中获取密钥。然后,您可以搜索每个键,看看它是否匹配您的正则表达式。

    m = re.compile('^for')
    keys = []
    for key in my_dict.keys():
       if m.match(key) != None:
          keys.append(key)