两个字符串之间的总不匹配

时间:2014-11-24 16:26:48

标签: python biopython genetics

我正在寻找一种方法来查找python中两个字符串之间的不匹配总数。我的输入是一个看起来像这样的列表

['sequence=AGATGG', 'sequence=AGCTAG', 'sequence=TGCTAG',
 'sequence=AGGTAG', 'sequence=AGCTAG', 'sequence=AGAGAG']

和我对每个字符串,我想看看它与序列"sequence=AGATAA"有多少差异。因此,如果输入是上面列表中的[0],则输出将如下所示:

sequence=AGATGG, 2

我无法弄清楚是否将每个字母拆分成单个列表,或者我是否应该尝试以某种方式比较整个字符串。任何帮助都很有用,谢谢

3 个答案:

答案 0 :(得分:2)

您可以使用sumzip轻松计算两个字符串之间成对不匹配的总数:

>>> 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

  1. 首先,你要摆脱" sequence ="。您可以切片每个字符串或

    seqs = [x.split("=")[1] for x in ['sequence=AGATGG',
                                      'sequence=AGCTAG',
                                      'sequence=TGCTAG',
                                      'sequence=AGGTAG',
                                      'sequence=AGCTAG',
                                      'sequence=AGAGAG']]
    
  2. 现在定义参考序列:

    ref_seq = "AGATAA"
    
  3. 使用pairwise可以计算对齐方式:

    from Bio import pairwise2
    
    for seq in seqs:
        print pairwise2.align.globalxx(ref_seq, seq)
    
  4. 我使用没有参数的对齐pairwise2.align.globalxx。其他函数接受匹配和间隙的不同值。请在http://biopython.org/DIST/docs/api/Bio.pairwise2-module.html处查看。