使用Python反向补充DNA链

use*_*999 6 python list bioinformatics dna-sequence biopython

我有一个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"))
Run Code Online (Sandbox Code Playgroud)

但是,当我试图找到补码词典中没有的项目时,使用下面的代码,我只得到最后一个基础的补充.它不会迭代.我想知道如何解决它.

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"))
Run Code Online (Sandbox Code Playgroud)

xbe*_*llo 26

其他答案非常好,但如果你打算处理真正的DNA序列,我建议你使用Biopython.如果你遇到像" - ","*"或不确定的字符怎么办?如果您想进一步操作序列怎么办?你想为每种文件格式创建一个解析器吗?

您要求的代码非常简单:

from Bio.Seq import Seq

seq = Seq("TCGGGCCC")

print seq.reverse_complement()
# GGGCCCGA
Run Code Online (Sandbox Code Playgroud)

现在,如果你想做另一个转换:

print seq.complement()
print seq.transcribe()
print seq.translate()
Run Code Online (Sandbox Code Playgroud)

输出

AGCCCGGG
UCGGGCCC
SG
Run Code Online (Sandbox Code Playgroud)

如果您遇到奇怪的字符,则无需继续向程序添加代码.Biopython处理它:

seq = Seq("TCGGGCCCX")
print seq.reverse_complement()
# XGGGCCCGA
Run Code Online (Sandbox Code Playgroud)


Jas*_*n S 15

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

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

  • @IgorBarinov:当密钥不可用时,`get`函数的默认返回类型为"None".将`base`设置为默认的返回类型可以避免出现`KeyError`并只插入`base`的值.结果是,现在处理(正确)序列中的异常字符. (4认同)

小智 10

import string
old_chars = "ACGT"
replace_chars = "TGCA"
tab = string.maketrans(old_chars,replace_chars)
print "AAAACCCGGT".translate(tab)[::-1]
Run Code Online (Sandbox Code Playgroud)

这将给你反向赞美= ACCGGGTTTT

  • 对我来说最好的答案。注意它需要适应python3:用`str`替换`string`(不需要导入),并且显然在`print`中加上括号。 (2认同)

Gab*_*iel 5

字典的方法get允许您在字典中没有键的情况下指定默认值。作为预处理步骤,我会将所有非“ATGC”碱基映射到单个字母(或标点符号、数字或任何不会出现在序列中的内容),然后反转序列,然后将单个字母替换为原始字母。或者,您可以先反转它,然后搜索并替换诸如sniwith之类的内容ins

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
Run Code Online (Sandbox Code Playgroud)

  • 只需使用“complement.get(base,base)”即可。 (2认同)