为什么我的 for 循环(python)在 4 次迭代后改变行为?

我正在尝试编写一个程序,该程序在 DNA 序列的定义长度的元素中移动,我无法理解我从循环中获得的输出。对于循环的前四次迭代,它似乎可以很好地进行移码,然后似乎恢复到旧序列。我已经非常努力地理解这种行为,但我对编程还太陌生,无法解决这个问题,非常感谢任何帮助。


这是我的代码:


seq = "ACTGCATTTTGCATTTT"


search = "TGCATTTTG"


import regex as re


def kmers(text,n):

  for a in text:

    b = text[text.index(a):text.index(a)+n]

    c = len(re.findall(b, text, overlapped=True))

    print ("the count for " + b + " is " + str(c))


(kmers(seq,3))

和我的输出:


the count for ACT is 1

the count for CTG is 1

the count for TGC is 2

the count for GCA is 2

#I expected 'CAT' next, from here on I don't understand the behaviour


the count for CTG is 1 

the count for ACT is 1

the count for TGC is 2

the count for TGC is 2

the count for TGC is 2

the count for TGC is 2

the count for GCA is 2

the count for CTG is 1

the count for ACT is 1

the count for TGC is 2

the count for TGC is 2

the count for TGC is 2

the count for TGC is 2

显然,最终我想删除重复项等,但是我一直在思考为什么我的 for 循环没有按照我预期的方式工作,这让我停下了脚步,使其变得更好。


浮云间
浏览 233回答 1
1回答

慕勒3428872

text.index始终返回找到的第一个索引。由于您seq逐个字母地迭代您 的字母,因此当您第一次点击以前找到的字母时,您会得到奇怪的结果。第 5 个字母是第一个重复的 a c,因此text.index('c')返回第一个c1的索引,而不是您期望的 4 - 并且您在上一次点击 时重复c。这种方法效率低下 - 与字母相比,您似乎对跨索引移动更感兴趣,所以我会使用:for a in range(len(text)-(n-1)):    b = text[a:a+n]    c = len(re.findall(b, text, overlapped=True))    print ("the count for " + b + " is " + str(c))而不是每次都搜索索引,这既低效又在您的情况下产生错误的结果。findall这里也是一种低效的计数方式 - 一个字典,特别是defaultdict可能被构造为更有效地计数。请注意,您可以使用已经很好的内置函数:>>> from collections import Counter>>> seq='ACTGCATTTTGCATTTT'>>> Counter((seq[i:i+3] for i in range(len(seq)-2)))Counter({'TTT': 4, 'TGC': 2, 'GCA': 2, 'CAT': 2, 'ATT': 2, 'ACT': 1, 'CTG': 1, 'TTG': 1})最后的点击是字符串结束的地方,你可以忽略它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python