用Python实现DNA链的反向补体

2024-05-31 13:37:05 发布

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

我有一个DNA序列,想用Python得到它的反向补体。它位于CSV文件的某一列中,我想将其反向补码写入同一文件中的另一列。棘手的是,有几个单元格除了a、T、G和C之外还有其他内容。我用这段代码得到了反补码:

def complement(seq):
    complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} 
    bases = list(seq) 
    bases = [complement[base] for base in bases] 
    return ''.join(bases)
    def reverse_complement(s):
        return complement(s[::-1])

    print "Reverse Complement:"
    print(reverse_complement("TCGGGCCC"))

然而,当我试图找到补语词典中不存在的项时,使用下面的代码,我只得到最后一个基的补语。它不会迭代。我想知道怎样才能修好它。

def complement(seq):
    complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} 
    bases = list(seq) 
    for element in bases:
        if element not in complement:
            print element  
        letters = [complement[base] for base in element] 
        return ''.join(letters)
def reverse_complement(seq):
    return complement(seq[::-1])

print "Reverse Complement:"
print(reverse_complement("TCGGGCCCCX"))

Tags: 文件代码inforbasereturndefelement
3条回答

一般来说,生成器表达式比原始代码简单,并且避免创建额外的列表对象。如果可以有多个字符插入,请使用其他答案。

complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))

字典的get方法允许您在键不在字典中时指定默认值。作为一个预处理步骤,我会将所有非“ATGC”基映射到单个字母(或标点符号或数字,或在序列中不显示的任何内容),然后反转序列,然后将单个字母替换为原始字母。或者,您可以先反转它,然后搜索并用ins替换像sni这样的内容。

alt_map = {'ins':'0'}
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} 

def reverse_complement(seq):    
    for k,v in alt_map.iteritems():
        seq = seq.replace(k,v)
    bases = list(seq) 
    bases = reversed([complement.get(base,base) for base in bases])
    bases = ''.join(bases)
    for k,v in alt_map.iteritems():
        bases = bases.replace(v,k)
    return bases

>>> seq = "TCGGinsGCCC"
>>> print "Reverse Complement:"
>>> print(reverse_complement(seq))
GGGCinsCCGA

其他的答案都很好,但是如果你打算处理真正的DNA序列,我建议你Biopython。如果遇到诸如“-”、“*”或不确定的字符怎么办?如果你想对你的序列做进一步的操作呢?是否要为每个文件格式创建解析器?

您要求的代码非常简单,如:

from Bio.Seq import Seq

seq = Seq("TCGGGCCC")

print seq.reverse_complement()
# GGGCCCGA

现在,如果要执行其他转换:

print seq.complement()
print seq.transcribe()
print seq.translate()

输出

AGCCCGGG
UCGGGCCC
SG

如果遇到奇怪的字符,就不必一直在程序中添加代码。Biopython处理它:

seq = Seq("TCGGGCCCX")
print seq.reverse_complement()
# XGGGCCCGA

相关问题 更多 >