Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试图在长字符串中查找某些字符的组合_Python_Python 3.x_String_Loops_Indexing - Fatal编程技术网

Python 试图在长字符串中查找某些字符的组合

Python 试图在长字符串中查找某些字符的组合,python,python-3.x,string,loops,indexing,Python,Python 3.x,String,Loops,Indexing,给定此长字符串s: 阿卡加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加CaagttaattaCagacctgaa 我试图找到ATG中出现的每一

给定此长字符串s:

阿卡加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加CaagttaattaCagacctgaa

我试图找到ATG中出现的每一个字符,并打印这个组合中出现的每一个字符的索引

我已经尝试过在字符串中循环,到目前为止,只有在找到第一次出现的字符ATG并打印出之后的字符索引(即8)后,才成功。然而,我的程序在此之后停止,即使字符串中出现了更多的字符ATG

for y in range(len(s)):
    y = s[i : i + 3]
    i = i + 3
    if y == 'ATG':
        print(s.index(y)+3)
在这部分代码中,“s”是字符串。
结果是8,因为它找到了第一次出现的ATG,并打印出了之后字符的索引。我的预期结果应该是81110278336和340。第一次找到ATG后,循环似乎停止,而不是一直遍历字符串直到结束。

您正在更改y和i的值。没有为每个迭代定义i。你想做的是

idx = 0

while idx < len(s) - 2:
    tempStr = s[idx : idx + 3]
    if tempStr == 'ATG':
        print(s.index(idx)+3)
        idx += 3
    else:
        idx += 1

代码中有几个错误,在for循环中使用y作为索引,然后作为字符串值

您将i增加3,因此您只检查索引0,3,6,。。。您希望在for循环为您所做的时间将索引更新为1,然后更改范围,使其成为lens-2


这应该是您试图编写的代码:

如果您需要固定字符串“ATG”的一行程序,请执行以下操作:

res = [n+3 for n in range(len(s)-2) if s[n:n+3] == 'ATG']
print(res)

这里有一个使用正则表达式的方法

import re
helix = "ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA"

iter = re.finditer(r"ATG", helix)
indices = [m.end(0) for m in iter]
print(indices)
结果是[81110278336340]。 我发现这种技术很有用

为了好玩,将其重新编码为一个函数,该函数允许您指定是否要在已定义螺旋线的情况下重叠

import re

def locate(haystack, needle, overlap=False):
    iter = re.finditer(f'(?=' + needle + r')' if overlap else needle, haystack)
    return [m.end(0) for m in iter]

print(locate(helix, 'ATG'))
print(locate(helix, 'CCC', True))
结果:

[8, 110, 278, 336, 340]
[15, 16, 17, 63, 68, 69, 82, 83, 177, 194, 195, 245, 246, 247, 248, 249, 278, 330]

对于按照以下要求建模的单衬套:



嘿:你设法在这5行中包含了相当多的逻辑错误:我将在一个答案中一一说明,但在此之前,我对这些事情感到好奇:为什么你要使用y作为范围计数器变量,然后在第2行中覆盖它?什么是y,为什么要做i=i+3,虽然已经有y了,但你在这里编程第二个计数器变量吗?为什么在一行之后使用y作为字符串变量?为什么以后还要用.index进行另一次查找?为什么要在查找中添加3?由于尝试和错误,得到了这些原因,实际上没有任何理由这样做,将使用i==lens-1访问s[i+2],意思是s[s.len+1],这是超出范围的。我将范围更改为rangelens-3-我将在答案中指出它自己的rangelens-2,否则您也找不到最后一个元素,printi+3以符合OP的要求。lens-2,否则您将错过最后一个元素。此外,我认为索引在这里不合适,为什么不直接执行printidx+3?在输入长度上使用循环查找方法会不必要地使时间复杂度增加^2。无论时间复杂度如何,都可能需要一行的解决方案,但是很高兴知道它没有其他循环方法那么有效。一行有更好的解决方案。我不会阻止你发布更好的一行解决方案:完成;:P并且它不在^2Odd上,但可以肯定。我将更新到m.start0+3,是的,如果我能更好地阅读问题,我可能会在当天获得更多奖学金。@Deepstop不要使用m.start0+3。使用m.end即可。@blhsing谢谢您的改进。我已经合并了它。请注意,这个解决方案不会返回重叠发生的索引,而OP代码的预期逻辑会返回重叠发生的索引。是的,我考虑过重叠,但认为ATG在任何情况下都不会重叠,所以我不担心它。然而,假设我们想要“CCC”作为在几个地方重叠的搜索,我们可以使用iter=re.finditerr'?=CCC',helix代替。如果是真的,我会使用:。。。;i+=3;普林蒂。@Finomis,这行得通,你为什么认为它有缺陷?天哪,它有!这是一个令人惊奇的奇观。我完全看错你了。我很抱歉。这实际上是最好的解决方案,因为它很可能是最快的!除了正则表达式之外,我现在也明白了你为什么建议I+=3。而且,我在没有清楚理解你想要实现什么的情况下,过早地投了反对票。现在我不能改变投票,除非你编辑。所以,如果你采纳了@wwii的建议,你会得到另一张选票;事实上,若OP打算找到子字符串的重叠出现,那个么我关于“前进三步”而不是“前进一步”的评论是错误的。非常感谢!我一直在努力解决这个问题,但你的例子很有道理
E我怎么没早点想到呢..还有,看看Brendan和Deepstop的回复,他们都比我的更快更好。我想我的是最接近你想要做的。
[8, 110, 278, 336, 340]
import re
helix = "ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA"

iter = re.finditer(r"ATG", helix)
indices = [m.end(0) for m in iter]
print(indices)
import re

def locate(haystack, needle, overlap=False):
    iter = re.finditer(f'(?=' + needle + r')' if overlap else needle, haystack)
    return [m.end(0) for m in iter]

print(locate(helix, 'ATG'))
print(locate(helix, 'CCC', True))
[8, 110, 278, 336, 340]
[15, 16, 17, 63, 68, 69, 82, 83, 177, 194, 195, 245, 246, 247, 248, 249, 278, 330]
>>> res = [n+3 for n in range(len(s)) if s.find('ATG', n) == n]
>>> res
[8, 110, 278, 336, 340]
i=0
while True:
    i=s.find("ATG",i)
    if i == -1: break
    i+=3
    print(i)