为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2021-09-14 15:10:10
我正在尝试编写一个程序,该程序在 DNA 序列的定义长度的元素中移动,我无法理解我从循环中获得的输出。对于循环的前四次迭代,它似乎可以很好地进行移码,然后似乎恢复到旧序列。我已经非常努力地理解这种行为,但我对编程还太陌生,无法解决这个问题,非常感谢任何帮助。这是我的代码:seq = "ACTGCATTTTGCATTTT"search = "TGCATTTTG"import regex as redef 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 1the count for CTG is 1the count for TGC is 2the count for GCA is 2#I expected 'CAT' next, from here on I don't understand the behaviourthe count for CTG is 1 the count for ACT is 1the count for TGC is 2the count for TGC is 2the count for TGC is 2the count for TGC is 2the count for GCA is 2the count for CTG is 1the count for ACT is 1the count for TGC is 2the count for TGC is 2the count for TGC is 2the count for TGC is 2显然,最终我想删除重复项等,但是我一直在思考为什么我的 for 循环没有按照我预期的方式工作,这让我停下了脚步,使其变得更好。
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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})

最后的点击是字符串结束的地方,你可以忽略它们。


查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信