python - 匹配子字符串是否存在于 python 字典的键中的最佳方法

标签 python string dictionary lookup

我有一个 Python 字典,其示例结构如下(摘录):

items = {
    "Google": "Mountain View",
    "Johnson & Johnson": "New Brunswick",
    "Apple": "Cupertino",
}

现在我得到的是一个字符串,即str1。我想要做的是查看字典 items 中的任何键是否存在于字符串 str1 中,例如,如果我有一个字符串 Where is Google based出?。最初我写了这个伪代码:

for str_word in str1.split():
    if str_word in items:
       print("Key found. Value is = ".format(items[str_word]))

现在这很好,因为字典键被索引/散列。所以 in 运算符运行时是不变的,但正如您所注意到的,这适用于 GoogleApple 之类的词,但不适用于 Johnson & Johnson(如果我的字符串是Where is Jonhnson & Johnson based of?)。

我能想到的另一种方法是首先从字典中提取所有键,然后逐个迭代每个键,看看它是否存在于 str1 中(与第一种方法)。这会增加运行时间,因为我的字典很大,有成百上千个键。

我想知道是否有一种方法可以修改我的第一种计数方法,以便能够将子字符串与可能包含多个单词的字典的键匹配,例如 Johnson & Johnson

最佳答案

如果您的字典没有改变,而您的输入字符串却改变了(您希望在其中找到键作为子字符串的那个),最快的方法之一是使用 Aho-Corasick algorithm .

算法的第一步是对字典中的字符串进行预处理,这与输入字符串无关,仅在 O(m) 时间和空间内完成一次,其中 m 是字典中键的长度之和。

然后,该算法将在 O(n + m + k) 中找到输入字符串中的所有出现,其中 n 是输入字符串的长度,k 是任何键作为输入字符串的子字符串出现的总次数。

您可以搜索 Aho-Corasick 算法的 Python 实现,这样您只需将其集成到您的代码中,而无需重写。

关于python - 匹配子字符串是否存在于 python 字典的键中的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52119128/

相关文章:

python - Pyqt:获取光标下的文本

python - Pickling pandas dataframe 将文件大小乘以 5

android - 将多个字符串添加到 ListArray?

json - 使用 gson 和 Retrofit 2 将所有 JSON 存储在 Map 中

python - 处理或引发 Python 异常是否有效?

delphi - TDictionary.ContainsKey 返回 false,即使键存在

python - 使用来自不同数据集的组均值填充一个数据集中的缺失值

python - 一个小项目的想法,我应该使用 Python 吗?

c - 不超过特定字符的字符串长度

c# - VB6 中的复合字符串格式化(即要格式化的字符串中的 : using {0}, {1} 和 {2})