2016-04-03 1 views
1

Je travaille sur un programme qui lit un fichier FASTQ et donne la quantité de N par séquence dans ce fichier. J'ai réussi à obtenir le nombre de N par ligne et je les ai mis dans une liste. Le problème est que j'ai besoin de tous les nombres dans une liste pour additionner la quantité totale de N dans le fichier mais ils sont imprimés dans leur propre liste.Comment combiner une quantité aléatoire de listes en python

C:\Users\Zokids\Desktop>N_counting.py test.fastq 
[4] 
4 
[3] 
3 
[5] 
5 

Ceci est ma sortie, la liste et le montant total dans la liste. J'ai vu des façons de combiner manuellement des listes, mais on peut avoir des centaines de séquences, ce qui n'est pas possible.

def Count_N(line): 
    ''' 
    This function takes a line and counts the anmount of N´s in the line 
    ''' 
    List = [] 
    Count = line.count("N") # Count the amount of N´s that are in the line returned by import_fastq_file 
    List.append(int(Count)) 

    Total = sum(List) 
    print(List) 
    print(Total) 

C'est ce que j'ai comme code, une autre fonction sélectionne les lignes.

J'espère que quelqu'un peut m'aider avec ceci. Merci d'avance.

+0

Vous pouvez regarder dans [ 'itertools.chain'] (https://docs.python.org/3/library/itertools.html#itertools.chain). – Paul

Répondre

0

Votre code indique que vous envoyez une ligne chaque fois que vous appelez count_N(). La liste que vous avez déclarée est une liste locale et est réinitialisée lorsque vous appelez la fonction à chaque fois. Vous pouvez déclarer la liste globale en utilisant:

global List =[] 

Je pense que vous devrez également déclarer la liste en dehors de la fonction afin d'accéder au niveau mondial.

Aussi, il serait préférable si vous totalisez la liste en dehors de la fonction. En ce moment, vous résumez la liste à l'intérieur de la fonction. Pour cela, vous devrez faire correspondre l'indentation avec la déclaration de la fonction.

+1

Il est généralement de mauvaise forme d'utiliser un global comme celui-ci. Si vous voulez vraiment ajouter à une liste, vous devriez probablement le passer à 'Count_N' en tant que paramètre. – Paul

+1

Ouais je suis d'accord mais donné donner ce problème, je suggère également de passer le nom du fichier et iter à travers les lignes à l'intérieur de la fonction. – denis

1

Le List que vous définissez dans votre fonction n'obtient jamais plus d'un élément, donc ce n'est pas très utile. Au lieu de cela, vous devriez probablement return le compte de la fonction, et laissez le code appelant (qui s'exécute probablement dans une sorte de boucle) append la valeur de sa propre liste. Bien sûr, comme il n'y a pas grand-chose à la fonction, vous pouvez simplement déplacer son contenu vers la boucle aussi!

Par exemple:

list_of_counts = [] 
for line in my_file: 
    count = line.count("N") 
    list_of_counts.append(count) 
total = sum(list_of_counts)