如果未找到匹配项,Python 2.7 将仅用一行退出 while 循环

Posted

技术标签:

【中文标题】如果未找到匹配项,Python 2.7 将仅用一行退出 while 循环【英文标题】:Python 2.7 exit a while loop with just one line if no match found 【发布时间】:2017-11-25 00:38:41 【问题描述】:

试图实现 Boyer Moore,错误的字符匹配算法而不看答案。如果没有找到模式,我想退出我只写一行“不匹配”的循环,这是我的代码:

T = 'ATGGGTATGGCTCGGCTCGG'
p = 'ATCG'

skip = 0

while skip + len(p) < len(T):

    string = T[skip:skip+len(p)]

    if string == p:
        print "offset at: ", skip
        break


    for i in range(len(string), 0, -1):


        if (string[i-1] != p[i-1]):

                if string[i-1] in p[:i-1]:
                    skip += (i - p.find(string[i-1]) - 1)
                    break

                elif not string[i-1] in p[:i-1]:
                    skip += i
                    break

关于如何修改代码的任何点击。

谢谢,

xp

edit:Scheme 给了我答案,就这么简单。我在行字符串 == p 或字符串!= p 中如此循环我的头。谢谢你们所有的cmets。

【问题讨论】:

听起来while-else 在这里可能有用,但是您对您想要做的事情的描述是模棱两可的,并且缺少太多细节来说明您真正想要做什么。 您可能想看看biopython 或类似的东西是否具有您想要的功能,或者Python 的内置字符串搜索算法是否足以满足您的用例。看起来您正在尝试实现高级字符串搜索算法(Boyer-Moore?),但您没有进行 Boyer-Moore 的预处理,并且诸如复制每个字符串切片和 Python 解释器开销之类的事情会减慢速度也下来了。 如何在循环之前使用布尔变量match = False,以及在循环之后/外部if not match: print "No match" 【参考方案1】:

如果我对您的理解正确,您想退出您的 while 循环并仅打印一次“不匹配”,如果字符串 p 不包含在 t 中。这看起来像是非常常见的 DNA 练习。

无论如何,做你想做的事情的一个简单方法是检查 t 中的子字符串 p 并在没有找到时中断。答案在这里:How to determine whether a substring is in a different string 会对此有所帮助。

基本上:

T = 'ATGGGTATGGCTCGGCTCGG'
p = 'ATCG'

skip = 0

while skip + len(p) < len(T):

    if not p in T:
        print "no match"
        break

    string = T[skip:skip+len(p)]

    if string == p:
        print "offset at: ", skip
        break


    for i in range(len(string), 0, -1):


        if (string[i-1] != p[i-1]):

                if string[i-1] in p[:i-1]:
                    skip += (i - p.find(string[i-1]) - 1)
                    break

                elif not string[i-1] in p[:i-1]:
                    skip += i
                    break

这里的关键是if not p in T: 这行基本上是说如果字符串p 不存在于字符串T 中,那么做一些事情。否则,继续。

除此之外,您可能还需要考虑一些好的做法,例如变量命名和使用函数。

【讨论】:

感谢您的回复。我意识到我对自己想要的东西模棱两可。我试图实现 Boyer Moore 进行字符串匹配。我知道那里有很多答案,但我需要自己尝试。因此,如果序列中有匹配项,此代码会告诉您匹配项在哪里,但是是的,就这么简单,您的答案会有所帮助。谢谢。【参考方案2】:

我没有完全理解您在这里想要实现的目标,但假设您想在基本字符串中搜索子字符串,您可以使用 in,如下所示:

if p in T:
    print "Match"
else:
    print "No match"

【讨论】:

我相信他会按照标准在 y 编程练习中找到所有出现的 x,而不仅仅是直接匹配。

以上是关于如果未找到匹配项,Python 2.7 将仅用一行退出 while 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 CentOS 6.4 在 Python 2.7 上修复“警告:未找到 GMP 或 MPIR 库;未构建 Crypto.PublickKey._fastmath”错误

UI 测试失败 - 未找到 MenuItems 的匹配项

在 select2 上禁用“未找到匹配项”文本和自动完成

zsh:未找到匹配项:请求 [安全]

未找到匹配项时 JPA 查询的返回值

Apache Drill UDF:未找到函数签名的匹配项