【问题标题】:Counting repeated STR in DNA PSET6 CS50计数 DNA PSET6 CS50 中的重复 STR
【发布时间】:2020-09-29 18:42:42
【问题描述】:

目前正在开发 CS50。我试图在文件 DNA 序列中计算 STR,但它总是多计。

我的意思是,例如:文件 DNA 中有多少“AGATC”连续重复。

此代码只是尝试找出如何准确计算那些重复的DNA。

import csv
import re
from sys import argv, exit

def main():
    if len(argv) != 3:
        print("Usage: python dna.py data.csv sequence.txt")
        exit(1)

    with open(argv[1]) as csv_file, open(argv[2]) as dna_file:
        reader = csv.reader(csv_file)
        #for row in reader:
        #    print(row)

        str_sequences = next(reader)[1:]

        dna = dna_file.read()
        for i in range(len(dna)):
            count = len(re.findall(str_sequences[0], dna))   # str_sequences[0] is 'AGATC'
        print(count)

main()

DNA 文件 11 (AGATC) 的结果:

$ python dna.py databases/large.csv sequences/11.txt
52

结果应该是 43。但是,对于 small.csv,它的计数准确。但对于大它总是超过计数。后来我知道我的代码计算了 DNA 文件(AGATC)中的所有匹配词。但任务是,您必须获取仅连续重复的 DNA,而忽略另一个相同的 DNA 是否再次出现。

{AGATCAGATCAGATCAGATC(T)TTTTAGATC}

那么,如果 DNA 击中 (T),如何停止计数,并且不需要计算后面的 AGATC? 我应该在我的代码中更改什么?特别是在我使用的 re.findall() 中。有人说用子串,怎么用子串呢?或者我可以像我一样使用正则表达式吗?

如果可以,请编写您的代码。对不起我的英语不好。

【问题讨论】:

    标签: python python-3.x cs50


    【解决方案1】:

    for 循环是错误的,它会继续计数序列,即使它们已经在循环的前面找到。我想你想改为循环 str_sequences

    类似:

    seq_list = []
    
    for STR in str_sequences:
        groups = re.findall(rf'(?:{STR})+', dna)
        if len(groups) == 0:
            seq_list.append('0')
        else:
            seq_list.append(str(max(map(lambda x: len(x)//len(STR), groups))))
    
    print(seq_list)
    

    另外,关于这个问题有很多posts。也许,您可以检查其中的一些来完成您的程序。

    【讨论】:

    • 哇,非常感谢。但是你能向我解释一下这是什么意思吗?这是我第一次使用python。 ----- seq_list = [ ] ------ rf'(?:{STR})+' ----- seq_list.append(str(max(map(lambda x: len(x)// len(STR), 组)))) ------
    • @Kevinkun 这是我第一次使用 python 你可能骗了我 - 你发布的代码非常适合学习 Python。我将尝试解释我今天晚些时候发布的代码。你试过运行它吗?
    • 是的,我使用了您的解决方案,并且我已经完成了任务。非常感谢!
    • @Kevinkun 很高兴你能够完成练习!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多