2009-11-15 5 views
2

Voici ce que j'ai, mais il semble plutôt redondant. Peut-être que quelqu'un de plus expérimenté en Python sait comment nettoyer ça? Devrait être assez explicite ce qu'il fait.Plus de façon pythonique pour trouver un brin d'ADN complémentaire

def complementary_strand(self, strand): 
     ''' Takes a DNA strand string and finds its opposite base pair match. ''' 
     strand = strand.upper() 
     newstrand = "" 
     for i in range(0, len(strand)): 
      if strand[i] == "T": 
       newstrand += "A" 

      if strand[i] == "A": 
       newstrand += "T" 

      if strand[i] == "G": 
       newstrand += "C" 

      if strand[i] == "C": 
       newstrand += "G" 

     return newstrand 
+0

Pourquoi définir un argument auto utilisé? S'il s'agit davantage d'une méthode statique, définir @staticmethod def suit_strand (brin) serait plus approprié. – EOL

+1

Une autre note: il est beaucoup plus rapide de mettre toutes vos nouvelles lettres dans une liste et de faire 'return '' .join (base_list)'. – EOL

+0

Encore une autre note: il est plus simple et plus rapide de faire 'pour base dans le brin' et de remplacer votre brin [i] par' base'. – EOL

Répondre

12

Pro Bably la façon la plus efficace de le faire, si la chaîne est assez longue:

import string 

def complementary_strand(self, strand): 
    return strand.translate(string.maketrans('TAGCtagc', 'ATCGATCG')) 

Cela rend l'utilisation des méthodes et translatemaketrans. Vous pouvez également déplacer la création de la table traduire en dehors de la fonction:

import string 
def __init__(self, ...): 
    self.trans = string.maketrans('TAGCtagc', 'ATCGATCG') 

def complementary_strand(self, strand): 
    return strand.translate(self.trans) 
+0

+1 - Je cherchais 'string.maketrans', puisque' strand.translate' a cette restriction intéressante de 256 caractères. –

+2

+1 - traduire est rapide comme un éclair graissé, et vous l'utilisez juste (en particulier dans la deuxième version basée sur la classe). –

+0

@Alex: Vous ne plaisantez pas, c'est beaucoup plus rapide que prévu. –

6

Encore mieux serait de concevoir un générateur, à la place:

TRANS = { "T": "A", "A": "T", "G": "C", "C": "G" } 

def complementary_strand(self, strand): 
    for base in strand.upper(): 
     yield TRANS[base] 

Ensuite, vous pouvez l'utiliser comme vous le souhaitez, et un itérateur est plus efficace:

for base in strand.complementary_strand(): 
    # Do something 
+2

J'allais poster quelque chose de très similaire à ceci, sauf que je définirais le dict 'trans' en dehors de cette fonction, parce que cette information est forcément nécessaire ailleurs et il serait bon de ne pas le répéter. –

+0

C'était implicite, mais je l'ai défini. –

+1

@JedSmith: est-ce réellement plus rapide/plus efficace que la solution de Nadia? – Forethinker

3

Quelque chose comme

def complementary_strand(self, strand): 
    return strand.upper().translate(maketrans("TAGC", "ATCG")) 
2
def __init__(self, *args): 
    # ... original __init__ method, and: 
    self.trans = { "T": "A", "A": "T", "G": "C", "C": "G" } 

def complementary_strand(self, strand): 
    '''Takes a DNA strand string and returns its opposite base pair match.''' 
    return ''.join([self.trans[base] for base in strand.upper()]) 
0
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) 
Questions connexes