【问题标题】:Efficient group substring search in Python?Python中高效的组子字符串搜索?
【发布时间】:2020-02-19 20:19:03
【问题描述】:

假设我已将文件中的一些信息加载到 Python3 字典中,结果如下所示。

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 ''

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

【问题讨论】:

  • 这个问题是基于意见的,但最有效的方法是对它们进行预分类。然后只需使用最快的算法搜索排序列表
  • 预分类什么?如果我正在寻找完全匹配的内容,我可以对字典的值进行预排序,但我正在检查它们是否是子字符串。
  • 对字典进行预排序,这样在其中的搜索会更快,但我想这无关紧要,因为 python 有 in 命令
  • 忘掉我说的话吧。

标签: python python-3.x search


【解决方案1】:

您可以使用正则表达式来避免额外的操作。在这里,您只需要使用 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 yield 它来获取所有出现的迭代器或使用字典来存储它们等。

【讨论】:

  • 我喜欢你的想法的原则,但具体的实现似乎并不能处理看起来很讨厌的字符串。例如。 d['lolwut'] = ['123!@#%%^&*)()))'] 会告诉我我的正则表达式有不平衡的括号。我不需要正则表达式,我只是在寻找子字符串。
  • @DeepDeadpool 在您提供的示例中使用该字符串没有意义,但是您可以使用 re.escape() 转义特殊字符。查看更新。
  • 很好 - 我会检查一下
  • 似乎工作 - 感谢更新。我会等几天看看有没有其他人提供其他解决方案。
猜你喜欢
  • 2012-08-28
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2014-10-12
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多