我有一些(通常是<300个符号长度)字符串,如'aabbccdcabcbbacdaaa'。
有python词典,其中键是类似格式的字符串,例如'bcccd',密钥长度从10到100个符号不等。该词典有五十万项目。
我需要将我的初始字符串与字典值匹配,或者发现字典中没有正确的值。匹配条件:字典键应该在字符串内(严格匹配)。
在计算速度方面,最好的方法是什么? 我觉得应该有一些棘手的方法来哈希我的初始字符串和字典键,以便应用一些聪明的子字符串搜索方式(如Rabin-Karp或Knuth-Morris-Pratt)。或者后缀树状结构可能是一个很好的解决方案吗?
答案 0 :(得分:4)
刚刚找到了Aho-Corasick for Python的合理实现 - pyahocorasick。摘自页面末尾的示例:
import ahocorasick
A = ahocorasick.Automaton()
for k, v in your_big_dict.iteritems():
A.add_word(k, v)
A.make_automaton()
for item in A.iter(your_long_string):
print(item)
答案 1 :(得分:1)
您可以使用以下格式:
for key in your_dictionary:
if key in your_string:
print(key+' is in both your string and the dictionary. It has the value '+str(your_dictionary[key]))
如果您希望以任何方式更改此内容,请在评论中告诉我,我们将很乐意更新。
答案 2 :(得分:1)
def search(string, dict_search):
# If those 2 lines are too expensive, calculate them and pass as arguments
max_key = max(len(x) for x in dict_search)
min_key = min(len(x) for x in dict_search)
return set(
string[x:x+i]
for i in range(min_key, max_key+1)
for x in range(len(string)-i+1)
if string[x:x+i] in dict_search
)
运行:
>>> search('aabbccdcabcbbacdaaa', {'aaa', 'acd', 'adb', 'bccd', 'cbbb', 'abc'})
{'aaa', 'abc', 'acd', 'bccd'}