Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 - Fatal编程技术网

混淆Python字符串索引超出范围错误

混淆Python字符串索引超出范围错误,python,python-3.x,Python,Python 3.x,我浏览了关于这个主题的其他问题,但找不到真正解决我想弄明白的问题的东西 问题是:我正试图创建一个程序,在两条互补的DNA链中寻找回文,返回每个已识别回文的位置和长度 例如,如果给定序列TTGATATCTT,程序应该找到补码(AACTATAGAA),然后将第二个索引标识为6个字符回文的开头 我对编程是全新的,所以它可能看起来非常愚蠢,但我提出的代码如下所示: '''This first part imports the sequence (usually consisting of multipl

我浏览了关于这个主题的其他问题,但找不到真正解决我想弄明白的问题的东西

问题是:我正试图创建一个程序,在两条互补的DNA链中寻找回文,返回每个已识别回文的位置和长度

例如,如果给定序列TTGATATCTT,程序应该找到补码(AACTATAGAA),然后将第二个索引标识为6个字符回文的开头

我对编程是全新的,所以它可能看起来非常愚蠢,但我提出的代码如下所示:

'''This first part imports the sequence (usually consisting of multiple lines of text)
from a file. I have a feeling there's an easier way of doing this, but I just don't
know what that would be.'''

length = 4
li = []
for line in open("C:/Python33/Stuff/Rosalind/rosalind_revp.txt"):
    if line[0] != ">":
        li.append(line)
seq = (''.join(li))

'''The complement() function takes the starting sequence and creates its complement'''

def complement(seq):
    li = []
    t = int(len(seq))
    for i in range(0, t):
        n = (seq[i])
        if n == "A":
            li.append(n.replace("A", "T"))        
        if n == "T":
            li.append(n.replace("T", "A"))
        if n == "C":
            li.append(n.replace("C", "G"))
        if n == "G":
            li.append(n.replace("G", "C"))
    answer = (''.join(li))
    return(answer)

'''the ip() function goes letter by letter, testing to see if it matches with the letter
x spaces in front of it on the complementary strand(x being specified by length). If the
letter doesn't match, it continues to the next one. After checking all possibilities for
one length, the function runs again with the argument length+1.'''

def ip(length, seq):
    n = 0
    comp = complement(seq)
    while length + n <= (len(seq)):
        for i in range(0, length-1):
            if seq[n + i] != comp[n + length - 1 - i]:
                n += 1
                break
            if (n + i) > (n + length - 1 - i):
                print(n + 1, length)
                n += 1
    if length <= 12:
        ip(length + 1, seq)

ip(length, seq)
''此第一部分导入序列(通常由多行文本组成)
从一个文件。我觉得有一种更简单的方法,但我就是不知道
我知道那会是什么
长度=4
li=[]
对于打开的行(“C:/Python33/Stuff/Rosalind/Rosalind_revp.txt”):
如果行[0]!=">":
li.追加(行)
seq=(''.join(li))
''complete()函数接受起始序列并创建其补码''
def补充(序号):
li=[]
t=int(len(seq))
对于范围(0,t)内的i:
n=(序号[i])
如果n==“A”:
li.附加(n.替换(“A”、“T”))
如果n==“T”:
li.附加(n.替换(“T”、“A”))
如果n==“C”:
li.附加(n.替换(“C”、“G”))
如果n==“G”:
li.附加(n.替换(“G”、“C”))
答案=(''.join(li))
返回(答复)
''ip()函数逐字母运行,测试它是否与字母匹配
在互补链上,它前面的x个空间(x由长度指定)。如果
字母不匹配,它将继续到下一个字母。在检查了所有可能的
一个长度,函数以参数长度+1再次运行。“”
def ip(长度,序号):
n=0
comp=补码(seq)
而长度+n(n+长度-1-i):
打印(n+1,长度)
n+=1

如果长度,
索引器
可以通过更改以下内容的最后一行来避免:

if line[0] != ">":
    li.append(line)

在代码的开头附近。这可以防止从文件中读取的任何尾随空格,尤其是换行符,成为
seq
字符串的一部分。将它们放在其中是一个问题,因为
complete()
函数忽略并删除它们,因此它返回的
answer
字符串不一定与输入参数的长度相同。这会导致in
ip()
函数中的
comp
seq
长度不同

您没有问,但下面是我如何缩短您的代码并使其更“Pythonic”:

complete=str.maketrans(“ATCG”、“TAGC”)
长度=4
以open(“palindrome.txt”)作为输入:
seq=''.join(如果行[0]!=“>”,则输入中的行的line.rstrip())
定义补码(seq):返回顺序翻译(补码)
def ip(长度,序号):
n=0
comp=补码(seq)
而长度+n+n+length-1-i:
打印(n+1,长度)
n+=1

如果长度,你能给出一个示例字符串和它的断裂长度吗?当然!“atatctgtcgttgctagcgtgtctagggaaaggtgggaatctctcttaactcggtt”61个字符。我很确定问题在于
seq[n+I]
的n和I的边界。做一些打印语句来调试那里的值,看看你是否会在某个时候得到
seq[len(seq)]
,这是不可能的。这就解决了它!太棒了,我从来都不知道会这么做。非常感谢你!尼克:不客气。事实上,我有点运气——可能是因为那是圣帕特里克教堂♣ 天;-)——几乎立刻就发现了问题。
if line[0] != ">":
    li.append(line)
if line[0] != ">":
    li.append(line.rstrip())
COMPLEMENT = str.maketrans("ATCG", "TAGC")
LENGTH = 4

with open("palindrome.txt") as input:
    seq = ''.join(line.rstrip() for line in input if line[0] != ">")

def complement(seq): return seq.translate(COMPLEMENT)

def ip(length, seq):
    n = 0
    comp = complement(seq)
    while length + n <= len(seq):
        for i in range(0, length-1):
            if seq[n + i] != comp[n + length - 1 - i]:
                n += 1
                break
            if n + i > n + length - 1 - i:
                print(n + 1, length)
                n += 1
    if length <= 12:
        ip(length + 1, seq)

print(repr(seq))
print(repr(complement(seq)))
ip(LENGTH, seq)