我有一个Python字典,其示例结构如下(摘录):
items = {
"Google": "Mountain View",
"Johnson & Johnson": "New Brunswick",
"Apple": "Cupertino",
}
现在我有了一个字符串,即str1
。我想做的是看看字典items
中的任何键是否存在于字符串str1
中,例如,如果我有一个类似Where is Google based out of?
的字符串。最初,我编写了此伪代码:
for str_word in str1.split():
if str_word in items:
print("Key found. Value is = ".format(items[str_word]))
现在这很好,因为字典键已编入索引/已散列。因此,in
运算符的运行时间是恒定的,但是您会注意到,此操作对于Google
或Apple
之类的单词来说效果很好,但不适用于Johnson & Johnson
(如果我的字符串是{ {1}}。
我可以想到的另一种方法是,首先从字典中提取所有键,然后在每个键上进行一个一个的迭代,然后查看它是否存在于Where is Jonhnson & Johnson based out of?
中(与第一种方法相反) 。这将增加运行时间,因为我的字典有成百上千的键。
我想知道是否有一种方法可以修改我的第一种方法,使其能够将子字符串与可能包含多个单词(例如str1
的字典的键进行匹配)?
答案 0 :(得分:3)
如果字典不变,而输入字符串却不变(您想在其中找到键作为子字符串),最快的方法之一就是使用Aho-Corasick algorithm。
算法的第一步是对字典中的字符串进行预处理,并且该操作仅在O(m)
时空中与输入字符串无关地进行一次,其中m
是长度的总和字典中的键。
然后,算法将在O(n + m + k)
的输入字符串中查找所有出现的位置,其中
n
是输入字符串的长度,而k
是任何键作为输入字符串的子字符串出现的总数。
您可以搜索Aho-Corasick算法的Python实现,这样您只需要将其集成到您的代码中,而无需重写它。
答案 1 :(得分:0)
如果字符串始终相同/具有结构,则可以使用正则表达式来匹配您要查找的键。
import re
string = 'Where is Johnson and Johnson based out of?'
match = re.search(r'Where is (.*) based out of?',string)
key = match.group(1)
当然,您应该对此进行修改以符合您的需要。
否则,我想我会采用您遍历dict键以查看它们是否与您的字符串匹配的方法。如果您使用多个键,例如str1
,则拆分&
可能会给您带来麻烦。
答案 2 :(得分:0)
方法可能如下:
items = {
"Google":"Mountain View",
"Johnson & Johnson": "New Brunswick",
"Apple": "Cupertino"
}
words = "Where is Johnson & Johnson based out of?".rstrip("?").split()
#find the max number of words in a key
len_max = max([len(s.split()) for s in items])
#split the sentence in consecutive words according to the maximum number of words in a key, i.e., in consecutive groups of size 1,2,...,len_max_words_in_key
to_check = [" ".join(words[i:i+j]) for j in range(1,len_max + 1) for i in range(0,len(words)+1-j)]
#check for the key
for el in to_check:
if el in items:
print("Key found. Value is = {}".format(items[el]))
由于句子很短,因此需要进行的检查数量很少。
例如,对于由20
个单词构成的句子和最多5
个单词构成的键,您需要90 = (20 + 19 + 18 + 17 + 16)
在字典中进行检查。
答案 3 :(得分:0)
对于字典中的多模式匹配,推荐的解决方案是Aho-Corasick, 用于静态和动态模式匹配的aho-corasick算法
此外,您也可以将此solution用于后缀树的动态模式匹配