11

我有一个 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"))
4

9 回答 9

36

其他答案都很好,但是如果您打算处理真实的 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
于 2014-08-07T18:16:38.013 回答
20

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

complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
于 2014-08-07T18:04:43.203 回答
14
import string
old_chars = "ACGT"
replace_chars = "TGCA"
tab = string.maketrans(old_chars,replace_chars)
print "AAAACCCGGT".translate(tab)[::-1]

这会给你相反的赞美= ACCGGGTTTT

于 2014-10-28T18:35:26.803 回答
4

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
于 2014-08-07T17:57:05.583 回答
3

反向补码最快的一个班轮如下:

def rev_compl(st):
    nn = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
    return "".join(nn[n] for n in reversed(st))
于 2020-02-05T06:49:55.467 回答
2

试试下面的代码,

complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
于 2019-09-23T10:10:33.357 回答
2
def ReverseComplement(Pattern):
    revcomp = []
    x = len(Pattern)
    for i in Pattern:
        x = x - 1
        revcomp.append(Pattern[x])
    return ''.join(revcomp)

# this if for the compliment 

def compliment(Nucleotide):
    comp = []
    for i in Nucleotide:
        if i == "T":
            comp.append("A")
        if i == "A":
            comp.append("T")
        if i == "G":
            comp.append("C")
        if i == "C":
            comp.append("G")

    return ''.join(comp)
于 2017-06-21T18:38:13.827 回答
1

还考虑退化的碱基:

def rev_compl(seq):
    BASES ='NRWSMBDACGTHVKSWY'
    return ''.join([BASES[-j] for j in [BASES.find(i) for i in seq][::-1]])
于 2021-06-06T08:30:35.490 回答
0

这可能是完成反向赞美的最快方法:

def complement(seq):
    complementary = { 'A':'T', 'T':'A', 'G':'C','C':'G' }
    return ''.join(reversed([complementary[i] for i in seq]))
于 2021-12-22T00:17:29.440 回答