Python 如何仅读取字符串或子字符串的特定部分

Python 如何仅读取字符串或子字符串的特定部分,python,cs50,Python,Cs50,该项目的目标是从文本文件中打开并读取DNA序列,例如,如果子字符串是AGATC,那么连续子字符串也是,我们添加到计数器中,一旦连续子字符串不再是AGATC,目标是将其计数到范围内的最高分数,清除计数器并继续搜索,以查找最长的连续序列 str_count = [] counter = 0 highest = 0 # read sequence with open(argv[2], "r")

该项目的目标是从文本文件中打开并读取DNA序列,例如,如果子字符串是AGATC,那么连续子字符串也是,我们添加到计数器中,一旦连续子字符串不再是AGATC,目标是将其计数到范围内的最高分数,清除计数器并继续搜索,以查找最长的连续序列

        str_count = []
        counter = 0
        highest = 0
        # read sequence
    
        with open(argv[2], "r") as seq:
            seqRead = seq.read()
            for i in range(len(seqRead)):
                #search for consecutive AGATC
                if i == 'A' and seqRead[i:i+6] == 'AGATC':
                    while i == 'A' and seqRead[i:i+6] == 'AGATC':
                        counter += 1
                        i = i + 5
                if highest < counter:
                    highest = counter
                    counter = 0
                else:
                    counter = 0
预期产量:最高=30

由于AGATC的最长连续出场时间为30次

输入:

AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG
输出:最高=4

我是否弄错了如何使用seqRead[i:i+6]


我怎样才能做得更好呢?

您的子字符串太长,
seqRead[I:I+6]
将给出长度为6个字符的字符串,而不是5个字符的字符串。该行(以及进行类似比较的另一行)应改为
seqRead[i:i+5]
。此外,您还试图将迭代器(
i
)与字母进行比较,而我认为您的目的是比较
seqRead
中迭代器位置的字母
i=='A'
应更改为
seqRead[i]=='A'

    str_count = []
    counter = 0
    highest = 0
    # read sequence

    with open(argv[2], "r") as seq:
        seqRead = seq.read()
        for i in range(len(seqRead)):
            #search for consecutive AGATC
            if seqRead[i] == 'A' and seqRead[i:i+5] == 'AGATC':
                while seqRead[i] == 'A' and seqRead[i:i+5] == 'AGATC':
                    counter += 1
                    i = i + 5
            if highest < counter:
                highest = counter
                counter = 0
            else:
                counter = 0
str_count=[]
计数器=0
最高=0
#读取顺序
打开(argv[2],“r”)如下:
seqRead=seq.read()
对于范围内的i(len(seqRead)):
#搜索连续的AGATC
如果seqRead[i]=“A”和seqRead[i:i+5]=“AGATC”:
而seqRead[i]=“A”和seqRead[i:i+5]=“AGATC”:
计数器+=1
i=i+5
如果最高<计数器:
最高=计数器
计数器=0
其他:
计数器=0

您的子字符串太长,
seqRead[i:i+6]
将给出长度为6个字符的字符串,而不是5个字符的字符串。该行(以及进行类似比较的另一行)应改为
seqRead[i:i+5]
。此外,您还试图将迭代器(
i
)与字母进行比较,而我认为您的目的是比较
seqRead
中迭代器位置的字母
i=='A'
应更改为
seqRead[i]=='A'

    str_count = []
    counter = 0
    highest = 0
    # read sequence

    with open(argv[2], "r") as seq:
        seqRead = seq.read()
        for i in range(len(seqRead)):
            #search for consecutive AGATC
            if seqRead[i] == 'A' and seqRead[i:i+5] == 'AGATC':
                while seqRead[i] == 'A' and seqRead[i:i+5] == 'AGATC':
                    counter += 1
                    i = i + 5
            if highest < counter:
                highest = counter
                counter = 0
            else:
                counter = 0
str_count=[]
计数器=0
最高=0
#读取顺序
打开(argv[2],“r”)如下:
seqRead=seq.read()
对于范围内的i(len(seqRead)):
#搜索连续的AGATC
如果seqRead[i]=“A”和seqRead[i:i+5]=“AGATC”:
而seqRead[i]=“A”和seqRead[i:i+5]=“AGATC”:
计数器+=1
i=i+5
如果最高<计数器:
最高=计数器
计数器=0
其他:
计数器=0

在您的代码
中,如果
之前
,而
循环是冗余的。您正在切片不正确的子字符串,下面是更新和简化的代码:

范围内i的
(len(seqRead)):
而seqRead[i:i+5]=“AGATC”:
计数器+=1
i+=5
如果计数器>最高值:
最高=计数器
计数器=0

在您的代码
中,如果
之前
,而
循环是冗余的。您正在切片不正确的子字符串,下面是更新和简化的代码:

范围内i的
(len(seqRead)):
而seqRead[i:i+5]=“AGATC”:
计数器+=1
i+=5
如果计数器>最高值:
最高=计数器
计数器=0


您还可以提供一个示例输入吗?预期产量是多少?它可能是您正在阅读的文件的一部分。使用示例编辑,并期望更正我的错误,但我认为您的第一个示例有29个连续出现,而不是30@Kwsswart感谢您提供示例输入。请看我的答案!您还可以提供一个示例输入吗?预期产量是多少?它可能是您正在阅读的文件的一部分。使用示例编辑,并期望更正我的错误,但我认为您的第一个示例有29个连续出现,而不是30@Kwsswart感谢您提供示例输入。请看我的答案!我一开始试了+5,但它也不起作用,这就是为什么我认为这与我的阅读方式有关it@Kwsswart啊,好的,我将用您提供的示例输入进行测试then@Kwsswart我更新了我的答案,还有一个problem@Kwsswart没问题,是的,我一开始也做了,哈哈,一开始尝试了+5,但它也不起作用,这就是为什么我认为这与我的阅读方式有关it@Kwsswart啊,好的,我将用您提供的示例输入进行测试then@Kwsswart我更新了我的答案,还有一个problem@Kwsswart没问题,是的,一开始我做的太多了,因为我意识到我的代码太长了,因为我意识到我的代码太长了