【问题标题】:How to read only a particular part of a string or a sub-string如何仅读取字符串或子字符串的特定部分
【发布时间】:2020-05-10 09:52:40
【问题描述】:

该项目的目标是从文本文件中打开并读取 DNA 序列,例如,如果子字符串是 AGATC,那么连续的子字符串也是,我们添加到计数器中,一旦连续的子字符串string 不再是 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] 有误吗?

我怎样才能做得更好?

【问题讨论】:

  • 您能否提供一个示例输入?和预期的输出?它可能是您正在阅读的文件的一部分。
  • 已编辑样本和预期
  • 如果我错了,请纠正我,但我认为你的第一个例子有 29 次连续出现,而不是 30 次
  • @Kwsswart 感谢您提供示例输入。请看我的回答!

标签: python cs50


【解决方案1】:

在您的代码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

【讨论】:

  • 感谢您让我的代码变得不必要地冗长
【解决方案2】:

您的子字符串太长,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

【讨论】:

  • 我一开始尝试了 + 5,但它也不起作用,这就是为什么我认为它与我阅读它的方式有关
  • @Kwsswart 啊,好的,我会用你提供的示例输入进行测试
  • @Kwsswart 我更新了我的答案,还有一个问题
  • @Kwsswart 没问题,是的,我一开始也是哈哈
猜你喜欢
  • 2022-01-24
  • 2015-12-29
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多