【问题标题】:Separate value that store consecutively in dictionary在字典中连续存储的单独值
【发布时间】:2021-02-12 09:33:24
【问题描述】:

我目前正在研究 CS50 问题集https://cs50.harvard.edu/x/2021/psets/6/dna/

问题只是告诉我们在 txt 文件中找到一些连续重复的 DNA 序列,并将总长度与 csv 文件中的人匹配。

这是我目前工作的代码(尚未完成):

import re, csv, sys

def main(argv):
    # Open csv file
    csv_file = open(sys.argv[1], 'r')
    str_person = csv.reader(csv_file)
    
    nucleotide = next(str_person)[1:]
    
    # Open dna sequences file
    txt_file = open(sys.argv[2], 'r')
    dna_file = txt_file.read()
    
    str_repeat = {}
    str_list = find_STRrepeats(str_repeat, nucleotide, dna_file)
        

def find_STRrepeats(str_list, nucleotide, dna):
    for STR in nucleotide:
        groups = re.findall(rf'(?:{STR})+', dna)
        if len(groups) == 0:
            str_list[STR] = 0
        else:
            str_list[STR] = groups
    print(str_list)


if __name__ == "__main__":
   main(sys.argv[1:])

输出(from the print(str_list)):

{'AGATC': ['AGATCAGATCAGATCAGATC'], 'AATG': ['AATG'], 'TATC': ['TATCTATCTATCTATCTATC']}

但是如你所见,字典中的值也是连续存储的。如果我想在str_list[STR] = len(groups) 中使用 len 函数,它将为字典中的每个键生成 1。因为我想找出 DNA 重复了多少次(总长度),并将其作为值存储在我的字典中。

所以,我希望它单独存储。有点像这样:

{'AGATC': ['AGATC', 'AGATC', 'AGATC', 'AGATC'], 'AATG': ['AATG'], 'TATC': ['TATC', 'TATC', 'TATC', 'TATC', 'TATC']}

我应该在我的代码中添加什么,以便它们可以用这样的昏迷分开?或者我可以在我的正则表达式代码groups = re.findall(rf'(?:{STR})+', dna) 中添加一些条件?

我不想更改整个正则表达式代码。因为我认为找到连续重复的最大长度的字符串已经很有用了。我为自己可以在没有帮助的情况下获得它感到自豪,因为我是 python 的初学者。请。谢谢。

【问题讨论】:

  • 只有 PyPi 正则表达式具有每个组支持的捕获堆栈。所以,首先使用pip install regex,然后使用import regexgroups = [x.captures(1) for x in regex.finditer(rf'({STR})+', dna)]

标签: python python-3.x regex cs50


【解决方案1】:

我只会存储最高的重复次数:

    ...
    if len(groups) == 0:
        str_list[STR] = 0
    else:
        str_list[STR] = max(len(i)/len(str) for i in groups)
    ....

顺便说一句,这将正确处理存在多个序列的情况。

【讨论】:

  • 但是你能向我解释一下这个max(len(i)/len(str) for i in groups) 是如何工作的吗?尤其是max 做什么?谢谢。
  • max 检索一个迭代的最大值,(len(i)/len(str) for i in groups) 是一个(生成器)迭代,给出每个 group 的重复次数(分组的大小划分按图案的大小当然是重复的次数)
猜你喜欢
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 2013-05-23
  • 2018-08-23
  • 2022-11-02
  • 2013-09-20
  • 2021-01-24
  • 2012-11-26
相关资源
最近更新 更多