我正在寻找一种方法来查找python中两个字符串之间的不匹配总数。我的输入是一个看起来像这样的列表
['sequence=AGATGG', 'sequence=AGCTAG', 'sequence=TGCTAG',
'sequence=AGGTAG', 'sequence=AGCTAG', 'sequence=AGAGAG']
和我对每个字符串,我想看看它与序列"sequence=AGATAA"
有多少差异。因此,如果输入是上面列表中的[0]
,则输出将如下所示:
sequence=AGATGG, 2
我无法弄清楚是否将每个字母拆分成单个列表,或者我是否应该尝试以某种方式比较整个字符串。任何帮助都很有用,谢谢
答案 0 :(得分:2)
您可以使用sum
和zip
轻松计算两个字符串之间成对不匹配的总数:
>>> s1='AGATGG'
>>> s2='AGATAA'
>>> sum(c1!=c2 for c1,c2 in zip(s1,s2))
2
如果您必须处理大小不同的字符串,您可能希望更喜欢from itertools import zip_longest
而不是zip
答案 1 :(得分:1)
见Levenshtein距离:http://en.wikipedia.org/wiki/Levenshtein_distance。
你会发现大量的python库可以有效地实现这个算法。
我认为比较这些基因序列更合适(因为它也可以很好地处理插入和缺失)。
答案 2 :(得分:1)
首先,我认为最安全的做法是将Levenshtein距离与某些图书馆联系起来。但由于您使用Biopython进行标记,因此可以使用pairwise
:
首先,你要摆脱" sequence ="。您可以切片每个字符串或
seqs = [x.split("=")[1] for x in ['sequence=AGATGG',
'sequence=AGCTAG',
'sequence=TGCTAG',
'sequence=AGGTAG',
'sequence=AGCTAG',
'sequence=AGAGAG']]
现在定义参考序列:
ref_seq = "AGATAA"
使用pairwise
可以计算对齐方式:
from Bio import pairwise2
for seq in seqs:
print pairwise2.align.globalxx(ref_seq, seq)
我使用没有参数的对齐pairwise2.align.globalxx
。其他函数接受匹配和间隙的不同值。请在http://biopython.org/DIST/docs/api/Bio.pairwise2-module.html处查看。