2013-10-03 4 views
0

J'ai un fichier texte dans le format suivant:Fonction ne fonctionne pas correctement dans la boucle for - Python

AAAAATTTTTT 
AAATTTTTTGGG 
TTTDDDCCVVVVV 

Je suis en train de calculer le nombre d'occurrences d'un caractère en séquence au début et à la fin de la ligne.

J'ai écrit la fonction suivante:

def getStartEnd(sequence): 
    start = sequence[0] 
    end = sequence[-1] 
    startCount = 0 
    endCount = 0 

    for char in sequence: 
     if char == start: 
      startCount += 1 
      if (char != start): 
       break 

    for char in reversed(sequence): 
     if char == end: 
      endCount += 1 
      if (char != end): 
       break 

    return startCount, endCount 

Cette fonction fonctionne de manière indépendante sur les chaînes. Pour .: par exemple

seq = "TTTDDDCCVVVVV" 
a,b = getStartEnd(seq) 
print a,b 

Mais quand j'insérer dans une boucle, il donne la valeur correcte uniquement sur la dernière ligne du fichier.

file = open("Test.txt", 'r') 

for line in file: 
    a,b = getStartEnd(str(line)) 
    print a, b 

Répondre

3

Parce que les lignes sauf la dernière ligne, contient des retours à la ligne.

Essayez de suivre (espaces de fin de bande):

with open("Test.txt", 'r') as f: 
    for line in f: 
     a, b = getStartEnd(line.rstrip()) 
     print a, b 

BTW, (char != end) dans le code suivant est toujours faux. (même pour le (char != start))

for char in reversed(sequence): 
    if char == end: 
     endCount += 1 
     if (char != end): # always False because char == end 
      break 

Voulez-vous dire cela?

for char in reversed(sequence): 
    if char == end: 
     endCount += 1 
    else: 
     break 

Comment l'utilisation itertools.takewhile:

import itertools 

def getStartEnd(sequence): 
    start = sequence[0] 
    end = sequence[-1] 
    start_count = sum(1 for _ in itertools.takewhile(lambda ch: ch == start, sequence)) 
    end_count = sum(1 for _ in itertools.takewhile(lambda ch: ch == end, reversed(sequence))) 
    return start_count, end_count 
+0

Merci beaucoup. Que diriez-vous de mon code? Est-ce un moyen élégant? – gthm

+0

@ gthmgeeky, De rien. Votre code ressemble à du code C;) – falsetru

+0

Je veux compter le premier caractère en séquence. Par exemple: AAAATTAGGAGGG, la lettre de départ A se produit 4 fois, et la lettre de fin G se produit 3 fois dans l'ordre continu. – gthm

1

Trois choses. Premièrement, dans votre fonction, vous vouliez probablement utiliser break en utilisant la structure suivante.

for char in sequence: 
    if char == start: 
     startCount += 1 
    else: 
     break 

for char in reversed(sequence): 
    if char == end: 
     endCount += 1 
    else: 
     break 

Deuxièmement, lorsque vous Boucler dans les lignes dans votre fichier, vous n'avez pas besoin de convertir les lignes en chaînes avec la fonction str. Ils sont déjà des ficelles! Troisièmement, les lignes incluent des caractères de nouvelle ligne qui sont comme suit: '\n' Ils sont utilisés pour dire à l'ordinateur quand terminer une ligne et en commencer une nouvelle. Pour se débarrasser d'eux, vous pouvez utiliser la méthode rstrip de la chaîne comme suit:

file = open("Test.txt", 'r') 

for line in file: 
    a,b = getStartEnd(line.rstrip()) 
    print a, b 
file.close() 
+0

Quatrièmement, utilisez l'instruction ['with'] (http://docs.python.org/2/whatsnew/2.5.html#pep-343-the-with-statement). – falsetru

Questions connexes