Python识别字符串集中的后缀

Posted

技术标签:

【中文标题】Python识别字符串集中的后缀【英文标题】:Python Identifying Suffix within set of strings 【发布时间】:2015-04-23 19:29:40 【问题描述】:

CheckIO 上做一个练习,我想知道为什么这不起作用。给定一组字符串,如果任何字符串是集合中任何其他字符串的后缀,我将尝试返回 True。否则为假。使用 itertools 我首先在元组中生成必要的排列。然后对于每个元组(每个 i),我想看看第二个元组是否在第一个元组的末尾(选项 1)。另一种方法是使用 .endwith 函数(选项 2),但两者都不适合我。为什么这两个选项有缺陷?

import itertools

def checkio(words_set):
    for i in itertools.permutations(words_set, 2):
    #option1 ---- if i[1] in i[0][-len(i[1]):]:
    #option2 ---- if i[0].endswith(i[1]):
            return True
        else:
            return False

例子:

checkio("hello", "lo", "he") == True

checkio("hello", "la", "hellow", "cow") == False

我知道这可以作为答案。但只是想知道为什么我的原始方法不会采用。

def checkio(words_set):
    for w1 in words_set:
        for w2 in words_set:
           if w1.endswith(w2) and w1 != w2:
               return True
    return False

【问题讨论】:

这是一个练习,所以我只建议考虑排序。 【参考方案1】:

return False 应该在 for 循环的末尾,否则函数将在每次第一次比较时返回 True/False,并忽略所有后续比较:

import itertools

def checkio(words_set):
    for i in itertools.permutations(words_set, 2):
        if i[0].endswith(i[1]):
            return True

    return False

【讨论】:

【参考方案2】:

由于是练习,我不会给你完整的答案,但是你确定你真的要在else 子句中的return False 吗?

【讨论】:

【参考方案3】:

这是因为您在第一次检查后就return False。如果失败,它将返回False,您需要将其从for 循环中删除!

但作为一种更 Pythonic 的方式,您可以在 any 函数中使用 combinations 和生成器表达式:

>>> from itertools import combinations
>>> s="hello", "lo", "he"
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s,2)))
True
>>> s2="hello", "la", "hellow", "cow"
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s2,2)))
False

【讨论】:

« 这是错误的,因为你总是检查 i[0].endswith(i[1]),但你需要 i[1].endswith(i[0])。 » — itertools.permutations 为您完成。 @Arkanosis 是的!我错过了!谢谢提醒!

以上是关于Python识别字符串集中的后缀的主要内容,如果未能解决你的问题,请参考以下文章

后缀自动机如何限制串长

BZOJ1396识别子串&BZOJ2865字符串识别(后缀自动机)

bzoj 2865 字符串识别——后缀数组

如何识别字符串数据集中的文本模板模式?

浅谈对后缀自动机的一点理解

算法后缀自动机(SAM)