用Python实现DNA链的反向互补

用Python实现DNA链的反向互补,python,list,bioinformatics,biopython,dna-sequence,Python,List,Bioinformatics,Biopython,Dna Sequence,我有一个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]

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

字典的
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

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

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

其他答案都很好,但如果你打算处理真实的DNA序列,我建议使用。如果遇到像“-”、“*”或未定义的字符,该怎么办?如果你想对你的序列做进一步的操作呢?您想为每个文件格式创建一个解析器吗

您要求的代码非常简单:

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

这会给你一个相反的恭维,请尝试下面的代码

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)
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
seq = "TCGGGCCC"
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))

反向补码的最快一行程序如下所示:

def rev_compl(st):
    nn = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
    return "".join(nn[n] for n in reversed(st))

还考虑退化基:

def rev_compl(seq):
    BASES ='NRWMBDACGTHVKSY'
    return ''.join([BASES[-j] for j in [BASES.find(i) for i in seq][::-1]])

你想要什么作为字典中没有的项目的补充?原始项目本身?您的
补码中的
返回值
缩进不正确。@aa333有些值像ins和dup,我想按原样打印它们。我曾尝试使用Bio.Seq,但它在反向补码时将“ins”转换为“sni”。首先用单字母替代物替换
ins
和其他“base”,然后将它们反向放置back@Gabriel有没有一种类似蟒蛇的方法可以做到这一点,因为我恐怕无法手动完成。谢谢你的回答。我不能硬编码元素'alt',因为它可以是任何东西。它没有明确的结构。在不知道其他基数将是什么的情况下更新了工作答案。只需使用
补码。获取(base,base)
。如果您想在某个地方发布此内容,请注意一种最快、更清晰的方法来反转字符串:
您的_字符串[::-1]
为什么需要
(base,base)
此处两次?@IgorBarinov:
get
函数的默认返回类型为
None
,用于密钥不可用时的返回。将
base
设置为默认返回类型可避免出现
keyrerror
,只需插入
base
的值即可。结果是序列中不寻常的字符现在被正确处理了。这对我来说是最好的答案。注意:它需要适应python3:用
str
(无需导入)替换
string
,并明显地在
print
中添加括号。2014年10月28日18:35回答-在正确的时间。。。是的,你说得对。很好的观察。在文章中添加代码格式。另外,考虑向您的解决方案添加任何解释。
def rev_compl(seq):
    BASES ='NRWMBDACGTHVKSY'
    return ''.join([BASES[-j] for j in [BASES.find(i) for i in seq][::-1]])