给出一个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
答案 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
我是编程新手,所以如果我错了请纠正我。