Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中高效的组子字符串搜索?_Python_Python 3.x_Search - Fatal编程技术网

Python中高效的组子字符串搜索?

Python中高效的组子字符串搜索?,python,python-3.x,search,Python,Python 3.x,Search,假设我从一个文件中加载了一些信息到一个Python3 dict中,结果如下所示 d = { 'hello' : ['hello', 'hi', 'greetings'], 'goodbye': ['bye', 'goodbye', 'adios'], 'lolwut': ['++$(@$(@%$(@#*', 'ASDF #!@# TOW'] } 假设我要分析一堆,我是说一吨的字符串。如果字符串包含给定键d的任何值,那么我想将其归类为该键中的值 例如 'My name i

假设我从一个文件中加载了一些信息到一个Python3 dict中,结果如下所示

d = {
    'hello' : ['hello', 'hi', 'greetings'],
    'goodbye': ['bye', 'goodbye', 'adios'],
    'lolwut': ['++$(@$(@%$(@#*', 'ASDF #!@# TOW']
}
假设我要分析一堆,我是说一吨的字符串。如果字符串包含给定键
d
的任何值,那么我想将其归类为该键中的值

例如

'My name is DDP, greetings' => 'hello'
显然,我可以像这样循环遍历键和值

def classify(s, d):
    for k, v in d.items():
        if any([x in s for x in v]):
            return k

    return ''

但我想知道是否有一种更有效的算法用于这种批量搜索;比我天真的循环更有效。有人知道这种算法吗?

您可以使用正则表达式来避免额外的操作。在这里,您只需将单词与一个pip字符连接起来,并将其传递给
re.search()
。由于顺序或确切的单词对您来说并不重要,因此您可以通过这种方式找出这些值与给定字符串之间是否存在交集

import re

def classify(s, d):
    for k, v in d.items():
        regex = re.compile(re.escape(r'|'.join(v)))
        if regex.search(s):
            return k

还要注意的是,您可以不返回
k
而生成它,以获取所有事件的迭代器或使用字典存储它们,等等。

这个问题是基于观点的,但最有效的方法是对它们进行预排序。那么就用最快的算法搜索一个排序的列表排序什么?如果我在寻找一个精确的匹配项,我可以对字典的值进行预排序,但我正在检查它们是否是子字符串。预排序字典以便在其中搜索更快,但我想这是不相干的,因为python在
命令中有
,忘了我说的吧。我喜欢你的想法的原则,但这个特定的实现似乎无法处理外观糟糕的字符串。例如,d['lolwut']=['123!@#%^&*)()”]将告诉我我的正则表达式有不平衡的括号。我不需要正则表达式,我只是在寻找子字符串。@DeepDeadpool在给出示例lol的情况下,使用该字符串没有意义,但是您可以使用
re.escape()
来转义特殊字符。检查更新。整洁-我会检查它的工作外-谢谢更新。我将等几天,看看是否有其他人提供其他解决方案。