在python中引入DNA串中的突变

时间:2012-07-27 00:16:33

标签: python

给出一个DNA字符串,例如AGC。我试图生成所有可能的uniq字符串,允许在给定字符串中达到#n(用户定义的数字)不匹配。

我可以通过以下方式解决一个不匹配问题,但无法实现递归解决方案以根据#n不匹配,DNA字符串和变异集(AGCTN)生成所有可能的组合

temp_dict = {}
sequence = 'AGC'

    for x in xrange(len(sequence)):
        prefix = sequence[:x]
        suffix = sequence[x+1:]
        temp_dict.update([ (prefix+base+suffix,1) for base in 'ACGTN'])
    print temp_dict

示例:

对于给定的样本字符串: ACG ,以下是允许最多一个不匹配的13个uniq序列

{'ACC': 1, 'ATG': 1, 'AAG': 1, 'ANG': 1, 'ACG': 1, 'GCG': 1, 'AGG': 1, 
'ACA': 1, 'ACN': 1, 'ACT': 1, 'TCG': 1, 'CCG': 1, 'NCG': 1}

我想概括这一点,以便程序可以使用100个字符长的DNA字符串并返回uniq字符串的列表/字典,允许用户定义#mismatches

谢谢! -Abhi

2 个答案:

答案 0 :(得分:5)

假设我理解你,我认为你可以使用itertools模块。基本思路是使用combinations选择会出现不匹配的位置,然后使用product构建所有令人满意的列表:

import itertools

def mismatch(word, letters, num_mismatches):
    for locs in itertools.combinations(range(len(word)), num_mismatches):
        this_word = [[char] for char in word]
        for loc in locs:
            orig_char = word[loc]
            this_word[loc] = [l for l in letters if l != orig_char]
        for poss in itertools.product(*this_word):
            yield ''.join(poss)

对于您的示例案例:

>>> mismatch("ACG", "ACGTN", 0)
<generator object mismatch at 0x1004bfaa0>
>>> list(mismatch("ACG", "ACGTN", 0))
['ACG']
>>> list(mismatch("ACG", "ACGTN", 1))
['CCG', 'GCG', 'TCG', 'NCG', 'AAG', 'AGG', 'ATG', 'ANG', 'ACA', 'ACC', 'ACT', 'ACN']

答案 1 :(得分:2)

我认为接受的答案只会提供 N 不匹配,而不是最多N 。对接受的答案略有修改应该纠正这一点我认为:

from itertools import combinations,product

def mismatch(word, i = 2):
  for d in range(i+1):
    for locs in combinations(range(len(word)), d):
      thisWord = [[char] for char in word]
      for loc in locs:
        origChar = word[loc]
        thisWord[loc] = [l for l in "ACGT" if l != origChar]
      for poss in product(*thisWord):
        yield "".join(poss)    

kMerList = list(mismatch("AAAA",3))

print kMerList

我是编程新手,所以如果我错了请纠正我。