[英]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)
它為Fasta文件提供的輸出包含3個序列:
ACTGACTGACTGACTGACTG
ACTGACTGACTG-ACTGACT
16
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-5
在我看來,第一個for循環只循環一次,第二個for循環不以第一個序列開始。
期望的輸出是將每個序列相互比較並評分。 因此,序列1與序列1及其得分進行比較,序列1與序列2及其得分進行比較,序列1與序列3及其得分等進行比較...
如果有人可以幫助我,那將非常感謝!
您的代碼不起作用的原因是您對內部循環和外部循環使用相同的循環變量record
。 您可能希望分別將其更改為record1
和record2
。
但更好的是,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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.