Python: 如何比较一个fasta文件中的多个序列?

Python: How to compare multiple sequences from a fasta file with each other?

我对 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及其分数比较,等等...

如果有人能帮助我,那将不胜感激!

您的代码不起作用的原因是您对内部循环和外部循环使用了相同的循环变量 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)