2
votes

Fréquence d'un caractère à chaque position de la liste intérieure

J'ai une liste de listes.

lst = []                                                            
with open("Control_nucleosome.fasta", "r", newline='\n') as report: 
    for line in report:                                             
        lst.append(line)                                            

for x in lst:                                                       
    if x[[0]]                                                       

Je veux calculer la fréquence "A" à chaque position de la liste interne.

Résultat attendu: p >

0.2, 0 , 0.6

Les listes internes sont de longueur égale.

[[A, B, C],[C, B, A],[B, B, B],[C, C, A],[B, C, A]]

Je ne sais pas comment aborder à la seconde boucle for. p>


1 commentaires

Il y a 5 listes internes et à la première position de chaque liste interne A n'est présente qu'une seule fois. Donc 1/5 vaut 0,2. Corrigez-moi si je me trompe


4 Réponses :


4
votes
[inner.count('A')/len(inner) for inner in zip(*lst)]

2 commentaires

Salut @nauer. y a-t-il un moyen de trouver la fréquence de A ou B en utilisant regrex ou une telle méthode. La production attendue serait maintenant de 0,6, 0,6, 0,8


Additionnez simplement les fréquences. [(inner.count ('A') + inner.count ('B')) / len (inner) for inner in zip (* lst)]



2
votes

Vous avez besoin de:

[0.2, 0.0, 0.6]

Résultat:

x = [['A', 'B', 'C'],['C', 'B', 'A'],['B', 'B', 'B'],['C', 'C', 'A'],['B', 'C', 'A']]

per = []

for i in range(len(x[0])):
    per.append(len([j[i] for j in x if j[i]=='A'])/len(x))

print(per)


2 commentaires

La longueur de la liste intérieure n'est pas de 3, elle peut s'étendre jusqu'à 200 mais toujours la même longueur.


Salut @AkshayNevrekar. existe-t-il un moyen de trouver la fréquence de A ou B en utilisant regrex ou une telle méthode. La production attendue serait maintenant de 0,6, 0,6, 0,8



1
votes

Vous pouvez parcourir la liste d'origine, puis parcourir les boucles internes pour trouver la réponse comme:

[0.2, 0.0, 0.6]

La sortie est:

x = [['A', 'B', 'C'],['C', 'B', 'A'],['B', 'B', 'B'],['C', 'C', 'A'],['B', 'C', 'A']]
answer = [0,0,0]
for ele in x:
    for idx,j in enumerate(ele):
        if j == 'A':
            answer[idx]+=1
for idx,i in enumerate(answer):
    answer[idx] = i / len(x)


1 commentaires

Merci Harshit, mais ces boucles imbriquées prendront beaucoup de temps lorsque vous aurez une liste plus grande. Quoi qu'il en soit, ça marche ...



0
votes

Cela peut aider:

import pandas as pd
li = [['A', 'B', 'C'],
      ['C', 'B', 'A'],
      ['B', 'B', 'B'],
      ['C', 'C', 'A'],
      ['B', 'C', 'A']]

Li = pd.DataFrame(li)
L = Li.where(Li=='A',0).where(Li!='A',1)
print(L.mean())


0 commentaires