【问题标题】:Problem in PSET6 finding strs in dna sequencePSET6 在 dna 序列中查找 strs 的问题
【发布时间】:2022-01-14 16:29:31
【问题描述】:

我在以下部分遇到问题:# 查找 DNA 序列中每个 STR 的最长匹配项。

我不明白为什么当我 print(longest_str) 我得到的所有值都等于 0 {'AGATC': 0, 'AATG': 0, 'TATC': 0}

我是不是调用longest_match函数错了?

PD:我是编程和 python 新手,感谢您的帮助!!

import csv
import sys   

def main():
    # TODO: Check for command-line usage
    longest_str = {}
    if len(sys.argv) != 3:
        sys.exit("Usage: python dna.py, data.csv, sequence.txt")

    # TODO: Read database file into a variable
    with open(sys.argv[1]) as f:
        data = csv.DictReader(f)

    # TODO: Read DNA sequence file into a variable
    with open(sys.argv[2]) as f2:
        dna_sequence = csv.DictReader(f2)

    # TODO: Find longest match of each STR in DNA sequence
    subsequences = data.fieldnames[1:]
    for subsequence in subsequences:
        longest_str[subsequence] = longest_match(str(dna_sequence), subsequence)
    print(longest_str)

# TODO: Check database for matching profiles

    return


def longest_match(sequence, subsequence):
    """Returns length of longest run of subsequence in sequence."""

    # Initialize variables
    longest_run = 0
    subsequence_length = len(subsequence)
    sequence_length = len(sequence)

    # Check each character in sequence for most consecutive runs of subsequence
    for i in range(sequence_length):

        # Initialize count of consecutive runs
        count = 0

        # Check for a subsequence match in a "substring" (a subset of characters) within sequence
        # If a match, move substring to next potential match in sequence
        # Continue moving substring and checking for matches until out of consecutive matches
        while True:

            # Adjust substring start and end
            start = i + count * subsequence_length
            end = start + subsequence_length

            # If there is a match in the substring
            if sequence[start:end] == subsequence:
                count += 1

            # If there is no match in the substring
            else:
                break

        # Update most consecutive matches found
        longest_run = max(longest_run, count)

    # After checking for runs at each character in seqeuence, return longest run found
    return longest_run


main()

【问题讨论】:

  • 为您提供longest_match()的函数定义。不确定是否需要发布(也许对于不熟悉 CS50 psets 和实验室的人来说)。此外,代码格式不正确。我试图修复。您应该检查以确保所有缩进都是正确的。

标签: python arrays function variables cs50


【解决方案1】:

dna 序列不是 csv 文件。 dna_sequence = csv.DictReader(f2)

dna_sequence 在这里是一个 dictreader 对象。 cs50 提供的longest_match 函数不知道如何处理它。它需要一个字符串。

【讨论】:

  • 那我该怎么办?谢谢!
  • @MatiasGarcia 您应该使用文件句柄附带的 read 方法来获取包含整个文件内容的字符串。然后将其传递给计数函数。
【解决方案2】:

为了澄清@Fuelled_By_Coffee 所说的,csv.DictReader() 返回一个 dictreader 对象。它用于遍历 CSV 文件中的行,为每行数据返回一个字典。所以,datadna_sequence 是 dictreader 对象,而不是每个文件的内容。

dictreader 对象适合读取 CSV 文件。但是,您还没有读完那个文件。在开始检查 DNA 序列之前,您需要将 CSV 文件中的所有数据读入内存。我的建议:在处理其余代码之前,先完成这项工作。

关于 dna_sequence 数据,这些文件不适用于 dictreader。此对象需要一个带有字段名称的标题行。要了解我的意思,请将sequence\1.txt 的内容与databases\small.csv 进行比较。注意 CSV 有一个标题行,而序列文件没有?您需要不同的 Python 方法来读取序列文件。

【讨论】:

  • 感谢您的回答!
  • @Matias,我回答你的问题了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2019-09-04
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多