使用partial关键字搜索python dict的最快方法

时间:2013-08-05 19:55:10

标签: python

确定dict是否包含以特定字符串开头的键的最快方法是什么?我们能做得比线性好吗?当我们只知道密钥的开头时,我们如何才能实现O(1)操作?

以下是目前的解决方案:

for key in dict.keys():
    if key.start_with(str):
        return True
return False

2 个答案:

答案 0 :(得分:28)

如果没有预处理字典,O(n)是您可以做的最好的。不过,它并不复杂:

any(key.startswith(mystr) for key in mydict)

(不要将dictstr用作变量名称,这些名称已经是两个built-in functions的名称。)

如果您可以预处理dict,请考虑将密钥放在前缀树(又名trie)中。维基百科文章中甚至还有Python implementation

答案 1 :(得分:0)

您可以将插入的键的所有前缀都放到dict中,因此对于键foo,您可以插入ffofoo。你会有O(1)查找,但你会花时间进行预处理(O(k),其中k是密钥长度),并浪费大量内存:

def insert_with_prefixes(key, value, dict_):
  prefixes = (key[:i+1] for i in xrange(len(key)))
  dict_.update((prefix, value) for prefix in prefixes)

对于日常使用,我会使用arshajii's回答中的方法(并且我去)。当然,请记住可能有许多短前缀冲突(例如:"h"):

>>> a = {}
>>> insert_with_prefixes('hello', 'world', a)
>>> insert_with_prefixes('homo', 'sapiens', a)
>>> a
{'h': 'sapiens', 'hom': 'sapiens', 'homo': 'sapiens', 'ho': 'sapiens', 
 'hel': 'world', 'hell': 'world', 'hello': 'world', 'he': 'world'}