寻找优雅的球状DNA链扩展

2024-04-25 23:49:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着做一个球状的DNA链的扩展,它有多个可能的碱基。在

我的DNA字符串的基部包含字母A、C、G和T。但是,我可以有像M这样的特殊字符,可以是A或C

例如,假设我有一个字符串:

ATMM

我想将此字符串作为输入并输出四个可能匹配的字符串:

ATAAATACATCAATCC

我觉得必须有一些优雅的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

Tags: 字符串inimportforbasesyslineproduct
3条回答

同意其他海报,这似乎是一件奇怪的事情想做。当然,如果您真的想这样做,在Python(2.6+)中有一种优雅的方法:

from itertools import product
map("".join, product(*[['A', 'C'] if x == "M" else [x] for x in "GMTTMCA"]))

带输入处理的完整解决方案:

^{pr2}$

这并不是一个真正的“扩展”问题,而且几乎可以肯定,对于任何合理的正则表达式来说,这都是不可行的。在

我相信你要找的是“如何生成排列”。在

您可能可以在python中使用yield操作符执行类似的操作

def glob(str):
      if str=='':           
          yield ''
          return      

      if str[0]!='M':
          for tail in glob(str[1:]): 
              yield str[0] + tail                  
      else:
         for c in ['A','G','C','T']:
             for tail in glob(str[1:]):
                 yield c + tail                 
      return

编辑:正如正确指出的那样,我犯了一些错误。这是我试用过的一个版本。在

相关问题 更多 >