繁体   English   中英

计数 DNA PSET6 CS50 中的重复 STR

[英]Counting repeated STR in DNA PSET6 CS50

目前正在研究 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() 中。 有人说用substring,怎么用substring? 或者我可以像我一样使用 regEx 吗?

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

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM