更多pythonic方式找到互补的DNA链

y2k*_*y2k 2 python

这就是我所拥有的,但它似乎有点多余.也许在Python中更有经验的人知道如何清理它?应该是非常自我解释它做什么.

def complementary_strand(self, strand):
        ''' Takes a DNA strand string and finds its opposite base pair match. '''
        strand = strand.upper()
        newstrand = ""
        for i in range(0, len(strand)):
            if strand[i] == "T":
                newstrand += "A"

            if strand[i] == "A":
                newstrand += "T"

            if strand[i] == "G":
                newstrand += "C"

            if strand[i] == "C":
                newstrand += "G"

        return newstrand
Run Code Online (Sandbox Code Playgroud)

Nad*_*mli 12

如果字符串足够长,可能是最有效的方法:

import string

def complementary_strand(self, strand):
    return strand.translate(string.maketrans('TAGCtagc', 'ATCGATCG'))
Run Code Online (Sandbox Code Playgroud)

这是利用translatemaketrans方法.您还可以在函数外部移动转换表:

import string
def __init__(self, ...):
    self.trans = string.maketrans('TAGCtagc', 'ATCGATCG')

def complementary_strand(self, strand):
    return strand.translate(self.trans)
Run Code Online (Sandbox Code Playgroud)

  • +1 - 翻译速度快,因为闪电,你正好使用它(特别是在第二个基于类的版本中). (2认同)

Jed*_*ith 6

更好的是制作发电机,而不是:

TRANS = { "T": "A", "A": "T", "G": "C", "C": "G" }

def complementary_strand(self, strand):
    for base in strand.upper():
        yield TRANS[base]
Run Code Online (Sandbox Code Playgroud)

然后你可以以任何你想要的方式使用它,并且迭代器更有效:

for base in strand.complementary_strand():
    # Do something
Run Code Online (Sandbox Code Playgroud)

  • 我打算发布与此类似的东西,除了我将在该函数之外定义`trans`字典,因为该信息必然在别处需要,并且不重复它是好的. (2认同)