2013-08-21 4 views
-2

im nouveau .. mon script est assez long donc je vais écrire les parties spécifiques.Une erreur en python

str= '' 
#str is a long DNA sequence 

def FIND_UPPER(str): 
    global x 
    x=str.upper() 
    y=0 
    while y>(-1): 
     y=x.find('CTTTGATTCCT') 
     z=x[y+11:y+22] 
     x=x[y+23:] 

     variability(z) 

#variability is another function 

FIND_UPPER(str) 

puis je reçois ce message:

indices de la liste doivent être des nombres entiers, pas str

au sujet de ces lignes:

variability(z) 
FIND UPPER(str) 

Comment puis-je résoudre ce ? grâce

modifier: cette variabilité est:

A=[0]*10 
C=[0]*10 
T=[0]*10 
G=[0]*10 

def variability(z): 
    for i in z: 
     if i=='A': 
      A[i]=A[i]+1 
      i=i+1 

     elif i=='T': 
      T[i]=T[i]+1 
      i=i+1 

     elif i=='C': 
      C[i]=C[i]+1 
      i=i+1 

     elif i=='G': 
      G[i]=G[i]+1 
      i=i+1 

    return G 
    return C 
    return T 
    return A 

Je l'ai fixé, u peut me dire si je suis u droit? :

def variability(z): 
    for i in range(len(z)): 
     if i=='A': 
      A[i]=z[i] 
      A[i]+=1 
      i+=1 

     elif i=='T': 
      T[i]=z[i] 
      T[i]+=1 
      i+=1 

     elif i=='C': 
      C[i]=z[i] 
      C[i]+=1 
      i+=1 

     elif i=='G': 
      G[i]=z[i] 
      G[i]+=1 
      i+=1 

    return G,C,T,A 
+1

Pourriez-vous s'il vous plaît nous montrer 'variability'? – TerryA

+9

Et le retraçage réel montrant ce que l'erreur se réfère à.Ce n'est pas seulement un bruit inutile, il vous dit en fait comment déboguer le problème. –

+2

Première chose: plusieurs instructions 'return' dans une fonction ne fonctionneront pas. Seul le premier sera exécuté, car il sort de la fonction. Si vous voulez retourner plusieurs choses, essayez d'utiliser un tuple. – rlms

Répondre

3
def variability(z): 
    for i in z: 
     if i=='A': 
      A[i]=A[i]+1 
      i=i+1 

On suppose i == 'A', puis A[i] est en fait traduit à A['A'] qui retourne:

list indices must be integers, not str

Ce qui signifie que vous ne pouvez pas accéder à une liste par un index de chaîne, les indices de la liste sont des entiers.

De plus, Python ne supporte pas les déclarations multiples de retour:

return G 
return C 
return T 
return A 

Ce sera toujours retour G

Si vous voulez retourner toutes ces valeurs, remplacez-le par:

return G,C,T,A 

Les instructions de retour ci-dessus renvoient une tuple composée G,C,T,A

Si vous voulez renvoyer un seul, placez chaque instruction return dans vos clauses elif.

0

Dans la boucle que vous devez faire quelque chose comme:

for i in range(len(z)): 
    letter = A[i] 

Si vous itérer sur résultat de la fonction de gamme, « i » prendre des valeurs numériques. Si vous itérer sur la chaîne, je vais prendre chaque caractère de la chaîne

Un comparez variable « lettre »

if letter == 'A': 
    ... 

Soyez prudent dans la fonction de la variabilité, seule la valeur dans la première déclaration de retour sera retourné .

+0

Cela retournera une erreur car 'z' est une chaîne. – Ofiris

+0

Vous avez raison. Juste édité merci :) – moliware

+0

Bien sûr, sur une note de côté, j'utiliser 'xrange'. – Ofiris