我在试着做一个球状的DNA链的扩展,它有多个可能的碱基。在
我的DNA字符串的基部包含字母A、C、G和T。但是,我可以有像M这样的特殊字符,可以是A或C
例如,假设我有一个字符串:
ATMM
我想将此字符串作为输入并输出四个可能匹配的字符串:
ATAA
ATAC
ATCA
ATCC
我觉得必须有一些优雅的Python/Perl/Regular表达式技巧才能做到这一点,而不是使用暴力来解决问题。在
谢谢你的建议。在
编辑,感谢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
同意其他海报,这似乎是一件奇怪的事情想做。当然,如果您真的想这样做,在Python(2.6+)中有一种优雅的方法:
带输入处理的完整解决方案:
^{pr2}$这并不是一个真正的“扩展”问题,而且几乎可以肯定,对于任何合理的正则表达式来说,这都是不可行的。在
我相信你要找的是“如何生成排列”。在
您可能可以在python中使用yield操作符执行类似的操作
编辑:正如正确指出的那样,我犯了一些错误。这是我试用过的一个版本。在
相关问题 更多 >
编程相关推荐