Python文本搜索问题

标签 python

<分区>

我想知道,如果你用 Python 打开一个文本文件。然后您想搜索包含多个字母的单词。

假设您输入了 6 个不同的字母(a、b、c、d、e、f)以进行搜索。 您想要查找至少匹配 3 个字母的单词。 每个字母在一个单词中只能出现一次。 并且字母“a”始终必须包含在内。

对于这种特定类型的搜索,代码应该是什么样的?

最佳答案

让我们看看...

return [x for x in document.split()
        if 'a' in x and sum((1 if y in 'abcdef' else 0 for y in x)) >= 3]
没有参数的

split 充当“单词”函数,拆分任何空格并删除不包含任何字符的单词。然后检查字母“a”是否在单词中。如果单词中有 'a',则使用遍历单词中每个字母的生成器表达式。如果该字母在可用字母字符串的内部,则它返回一个 1,该值对总和有贡献。否则,它返回 0。然后,如果总和为 3 或更大,则保留它。使用生成器而不是列表理解,因为 sum 将接受任何可迭代的内容,并且它停止必须创建临时列表(更少的内存开销)。

由于使用了 in(在字符串上应该有 O(n) 时间),所以它没有最佳访问时间,但这通常不是什么大问题除非数据集很大。您可以稍微优化一下以将字符串打包成一个集合,并且常量“abcdef”可以很容易地成为一个集合。我只是不想破坏漂亮的衬垫。

编辑:哦,为了缩短 if 部分(这是效率低下的地方)的时间,您可以将它分离到一个函数中,该函数迭代字符串一次并返回 True 如果满足条件。我会这样做,但它毁了我的一个类轮。

编辑 2:我没有看到“必须有 3 个不同的字符”部分。你不能在一个类轮中做到这一点。您可以将 if 部分取出到一个函数中。

def is_valid(word, chars):
    count = 0
    for x in word:
        if x in chars:
            count += 1
            chars.remove(x)
    return count >= 3 and 'a' not in chars

def parse_document(document):
    return [x for x in document.split() if is_valid(x, set('abcdef'))]

这个在真实世界的数据集上应该没有任何性能问题。

关于Python文本搜索问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7518255/

相关文章:

python - 创建仅限于本地主机连接的套接字

python - 如何为 Django 模型实例创建非数据库自动属性

python - 使用定义变量创建表

python - 尝试安装 qrcode-0.2.1 时出现 "Unable to find vcvarsall.bat"错误

python - ONVIF-Python + ZEEP : create_service not working

python - 根据字典值和 python 中的一些条件创建列表

python - Django 中的酒店预订系统 : How to make a room unavailable to other users for a period of time

python - 通过近似相等的数字比较左加入 Pandas

python - KD/Qtree 实现

python - 在python中移动数组的元素