Complemento inverso de la cadena de ADN utilizando Python

Tengo una secuencia de ADN y me gustaría obtener un complemento inverso de ella utilizando Python. Está en una de las columnas de un archivo CSV y me gustaría escribir el complemento inverso en otra columna en el mismo archivo. La parte difícil es que hay algunas celdas con algo más que A, T, G y C. Pude obtener un complemento inverso con este código:

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")) 

Sin embargo, cuando trato de encontrar el elemento que no está presente en el diccionario del complemento, usando el código de abajo, obtengo el complemento de la última base. No itera. Me gustaría saber cómo puedo arreglarlo.

 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")) 

El método de get de un diccionario le permite especificar un valor predeterminado si la clave no está en el diccionario. Como paso de preacondicionamiento, asignaría todas sus bases que no sean ‘ATGC’ a letras individuales (o puntuación o números o cualquier cosa que no aparezca en su secuencia), luego invierta la secuencia y luego reemplace la letra única que alterna con sus originales. Alternativamente, puedes revertirlo primero y luego buscar y reemplazar cosas como sni con 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 

Las otras respuestas están perfectamente bien, pero si planeas lidiar con secuencias de ADN reales, te sugiero Biopython . ¿Qué sucede si encuentras un personaje como “-“, “*” o indefiniciones? ¿Qué pasa si quieres hacer más manipulaciones de tus secuencias? ¿Desea crear un analizador para cada formato de archivo?

El código que solicitas es tan fácil como:

 from Bio.Seq import Seq seq = Seq("TCGGGCCC") print seq.reverse_complement() # GGGCCCGA 

Ahora si quieres hacer otras transformaciones:

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

Salidas

 AGCCCGGG UCGGGCCC SG 

Y si te encuentras con caracteres extraños, no es necesario que sigas agregando código a tu progtwig. Biopython lo trata:

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

En general, una expresión generadora es más simple que el código original y evita la creación de objetos de lista adicionales. Si puede haber inserciones de múltiples caracteres, vaya con las otras respuestas.

 complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} seq = "TCGGGCCC" reverse_complement = "".join(complement.get(base, base) for base in reversed(seq)) 
 import string old_chars = "ACGT" replace_chars = "TGCA" tab = string.maketrans(old_chars,replace_chars) print "AAAACCCGGT".translate(tab)[::-1] 

que le dará el complemento inverso = ACCGGGTTTT

 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)