<分区>
我想知道,如果你用 Python 打开一个文本文件。然后您想搜索包含多个字母的单词。
假设您输入了 6 个不同的字母(a、b、c、d、e、f)以进行搜索。 您想要查找至少匹配 3 个字母的单词。 每个字母在一个单词中只能出现一次。 并且字母“a”始终必须包含在内。
对于这种特定类型的搜索,代码应该是什么样的?
标签 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 - 如何为 Django 模型实例创建非数据库自动属性
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