确定dict是否包含以特定字符串开头的键的最快方法是什么?我们能做得比线性好吗?当我们只知道密钥的开头时,我们如何才能实现O(1)操作?
以下是目前的解决方案:
for key in dict.keys():
if key.start_with(str):
return True
return False
答案 0 :(得分:28)
如果没有预处理字典,O(n)
是您可以做的最好的。不过,它并不复杂:
any(key.startswith(mystr) for key in mydict)
(不要将dict
和str
用作变量名称,这些名称已经是两个built-in functions的名称。)
如果您可以预处理dict,请考虑将密钥放在前缀树(又名trie)中。维基百科文章中甚至还有Python implementation。
答案 1 :(得分:0)
您可以将插入的键的所有前缀都放到dict中,因此对于键foo
,您可以插入f
,fo
和foo
。你会有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'}