更符合Python风格的寻找互补DNA链方法

2 投票
5 回答
10416 浏览
提问于 2025-04-15 16:02

我有这个代码,但感觉有点多余。也许有经验的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

5 个回答

3

类似这样的内容

def complementary_strand(self, strand):
    return strand.upper().translate(maketrans("TAGC", "ATCG"))
6

更好的方法是制作一个生成器:

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

def complementary_strand(self, strand):
    for base in strand.upper():
        yield TRANS[base]

这样你就可以随意使用它,而且迭代器的效率更高:

for base in strand.complementary_strand():
    # Do something
12

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

import string

def complementary_strand(self, strand):
    return strand.translate(string.maketrans('TAGCtagc', 'ATCGATCG'))

这里使用了 translatemaketrans 这两个方法。你还可以把创建转换表的部分放到函数外面:

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

def complementary_strand(self, strand):
    return strand.translate(self.trans)

撰写回答