【问题标题】:Python: How to compare multiple sequences from a fasta file with each other?Python:如何将fasta文件中的多个序列相互比较?
【发布时间】:2017-04-24 00:04:31
【问题描述】:

我对 python 的编程世界很陌生,我正在尝试编写一个脚本,给定一个 FASTA 文件,它将相互比较序列并对它们进行评分(如果序列 A 中的核苷酸位置匹配如果核苷酸在序列 B 的相同位置,则分数会上升 2,例如)。到目前为止,我得到了这个:

from Bio import SeqIO


def sequence_compare(file):
    seq_records = SeqIO.parse(file, "fasta") 
    for record in seq_records:
        len1 = len(str(record.seq))
        sequence1 = str(record.seq)
        print(sequence1)
        for record in seq_records:
            len2= len(str(record.seq))
            sequence2 = str(record.seq)
            print(sequence2)
            a = 0
            for pos in range (0,min(len1,len2)) :
                if sequence1[pos] == sequence2[pos]:
                    a+= 2
                if sequence1[pos] != sequence2[pos]:
                    a+= -1
                if sequence1[pos] == sequence2[pos] == '-':
                    a+= -2
            print(a)

它为包含 3 个序列的 Fasta 文件提供的输出:

ACTGACTGACTGACTGACTG
ACTGACTGACTG-ACTGACT
16
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-5

在我看来,第一个 for 循环只循环一次,第二个 for 循环不是从第一个序列开始的。

期望的输出是每个序列相互比较并评分。所以序列 1 与序列 1 及其分数进行比较,序列 1 与序列 2 及其分数进行比较,序列 1 与序列 3 及其分数进行比较,等等……

如果有人可以帮助我,将不胜感激!

【问题讨论】:

  • 您为什么要制定自己的(相当简单的)评分算法? Bio.Align 有很多选择。
  • 我不知道 Bio.Align 中存在。感谢您的建议,我会研究一下!

标签: python for-loop biopython fasta


【解决方案1】:

您的代码不起作用的原因是您对内部和外部循环使用了相同的循环变量record。您可能希望将其分别更改为 record1record2

但更好的是,python 支持在 itertools.combinations() 中进行成对组合,因此您可以避免嵌套循环。

另外,最好将您的评分算法转移到一个单独的函数中。

考虑到以上两个变化,代码如下:

from Bio import SeqIO
from itertools import combinations


def score(sequence1, sequence2):
    a = 0
    for pos in range(0, min(len(sequence1), len(sequence2))):
        if sequence1[pos] == sequence2[pos]:
            a += 2
        if sequence1[pos] != sequence2[pos]:
            a += -1
        if sequence1[pos] == sequence2[pos] == '-':
            a += -2
    return a


def sequence_compare(file):
    seq_records = SeqIO.parse(file, "fasta")
    for record1, record2 in combinations(seq_records, 2):
        sequence1 = record1.seq
        sequence2 = record2.seq
        a = score(sequence1, sequence2)
        print(sequence1)
        print(sequence2)
        print(a)

【讨论】:

  • 这确实有效!太感谢了!但是如果我想让它把这个序列和它本身进行比较呢?那么将序列 1 与序列 1 进行比较?我知道这是不切实际的,但是可以通过组合来实现吗?谢谢! :)
  • @D.Teeki 是的。只需使用 itertools.combinations_with_replacement() 链接:docs.python.org/3/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2022-08-19
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多