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

时间:2020-05-10 09:52:40

标签: python cs50

该项目的目标是打开和读取文本文件中的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

现在,我认为我遇到的问题是我认为我没有正确比较文本序列,因此无法读取字符串中字母的正确序列。

我的目标是将“ i”作为“ A”进行跟踪,然后提取连续的4个字母并将其与“ AGATC”进行比较,如果匹配则增加计数器并将“ i”更改为比较后的字母,并且如果是A,则重复直到不再连续,然后加到最高点直到结束。 这是最不正确的,但是在运行调试器时,我注意到它从未输入第一个if语句,这使我相信我比较的方式是错误的。

样本输入:

AGATCAGATCAGATCAGATCAGATCDJFDHFDTTTTCCSSDDSDDGFJFHAGATCAGATCAGATCAGATCAGATCAGATGJFHJGHJDSHGDKFSAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCDKFDKDFKGJKDFKAGATCkFGJKFDDAGATCDFKJKFJFKDJKAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCKFDHDFKFDHKGHKDFGJFKHDFK

预期输出:最高= 30

由于AGATC的最长连续出现是30个。

输入:

AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG

输出:最高= 4

我误会了如何使用seqRead [i:i + 6]吗?

我该如何做得更好?

2 个答案:

答案 0 :(得分:0)

您的子字符串太长,seqRead[i:i+6]将给出一个长度为6个字符而不是5个字符的字符串。该行(以及进行类似比较的另一行)应改为seqRead[i:i+5]。另外,当我认为您打算在i中的迭代器的 position 处比较字母时,您尝试将迭代器(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

答案 1 :(得分:0)

if循环之前的代码while中是多余的。而且您要分割不正确的子字符串,这是更新和简化的代码:

for i in range(len(seqRead)):
    while seqRead[i:i+5] == "AGATC":
        counter += 1
        i += 5
    if counter > highest:
        highest = counter
    counter = 0