我正在尝试对一组具有多个可能碱基的 DNA 字符串进行类似球状的扩展。
我的 DNA 字符串的碱基包含字母 A、C、G 和 T。但是,我可以有特殊字符,例如 M,可以是 A 或 C。
例如,假设我有字符串:
ATMM
我想将此字符串作为输入并输出四个可能的匹配字符串:
ATAA
ATAC
ATCA
ATCC
我觉得必须有一些优雅的 Python/Perl/正则表达式技巧才能做到这一点,而不是蛮力解决方案。
谢谢你的任何建议。
编辑,感谢 cortex 的产品运营商。这是我的解决方案:
仍然是 Python 新手,所以我敢打赌,处理每个字典键的方法比另一个 for 循环更好。任何建议都会很棒。
import sys
from itertools import product
baseDict = dict(M=['A','C'],R=['A','G'],W=['A','T'],S=['C','G'],
Y=['C','T'],K=['G','T'],V=['A','C','G'],
H=['A','C','T'],D=['A','G','T'],B=['C','G','T'])
def glob(str):
strings = [str]
## this loop visits very possible base in the dictionary
## probably a cleaner way to do it
for base in baseDict:
oldstrings = strings
strings = []
for string in oldstrings:
strings += map("".join,product(*[baseDict[base] if x == base
else [x] for x in string]))
return strings
for line in sys.stdin.readlines():
line = line.rstrip('\n')
permutations = glob(line)
for x in permutations:
print x