我有一本字典说
stringToListDict = {'foo' : [], 'bar' : []}
现在让我们假设是这样
+福福
stringToListDict = {'foo' : ['foofoo'], 'bar' : []}
+芭芭拉
stringToListDict = {'foo' : ['foofoo'], 'bar' : ['barbar']}
+巴巴拉
stringToListDict = {'foo' : ['foofoo', 'foobarbar'], 'bar' : ['barbar']}
+不匹配任何键
Simply discard this new string.
如您所见,添加的字符串将匹配键作为前缀。你知道吗
我可以通过逐个遍历字典中的每个键来实现这一点,直到得到匹配的前缀。但是,还有其他优雅或有效的方法吗?您不必担心边缘场景,例如如果:
stringToListDict = {'foo' : ['foofoo'], 'foobar' : [], 'bar' : ['barbar']}
then +foobarbar
仅供参考,这不是任务。你知道吗
如果您使用的是dict,那么是的,您将不得不迭代所有键以找到任何匹配项。dict是建立在哈希表上的,哈希函数没有任何可以利用的“start with”或“close”的概念(事实上,它们是专门为close输入提供非常不同的输出的)。你知道吗
做你想做的事一点都不难:
但是如果dict很大,那么效率就很低,因为你在做线性搜索。你知道吗
您可以使其与键的长度成线性关系,而不是与dict的长度成线性关系(在您的测试用例中,dict实际上会慢一些,但在性能重要的大多数情况下可能会快一些):
但是,如果您需要最佳效率,您需要查看对数数据结构,比如平衡二叉搜索树、b-树、skiplist、trie,甚至只是按排序顺序保存的普通旧列表。在PyPI或ActiveState配方库中可以找到的大多数此类类型的实现都有一个方法,可以按排序顺序查找键的插入位置。或者,如果您使用的是普通的旧列表,只需使用stdlib中的
bisect
模块即可。只需在插入位置之前检查密钥,要么它以您的密钥开始,要么什么都不做。你知道吗例如,使用^{} :
如果你有一个庞大而密集的密钥集,并且你要做大量的查询和插入,那么前缀trie可能是最有效的。但由于不同的特点,其他人可能会胜出。所以,如果这很重要的话,你可以试一下。你知道吗
您可以尝试:
Ideone Demo
可以使用以下函数执行前缀匹配:
代码:
测试代码:
结果:
相关问题 更多 >
编程相关推荐