Aide problème liste vide

-
Bonjour, j'ai effectué ce programme, mon problème c'est que dans ma fonction experiment, je n'arrive pas a stocké mais valeur dans ma liste data, cela viens surement de ma fonction hamming qui retourne une difference entre 2 sequence, ce dont j'ai besoin dans la liste (je veux une liste de toutes les differences entre les sequence generées pour ensuite en faire la moyenne avec ma fonction mean). Après beaucoup de manipulation, j'ai du mal a trouver une solution.
En esperant que vous puissiez m'aider


import random

def alphabet(name):
    global alpha 
    if name=="nucleic":
        alpha="acgt"
        print (alpha)
    if name=="protein":
        alpha="ARNDBCEQZGHILKMFPSTWYV"
        print (alpha)
    if name=="iupac_nucleic":
        alpha="ACGTRYSWKMBDHVN"
        print (alpha)
    if name=="iupac_protein":
        alpha="ARNDBCEQZGHILKMFPSTWYV"
        print (alpha)
        
def randseq(num,alpha): 
    seq1=[]
    for i in range(0,num):
        ahbon=random.randint(0,(len(alpha)-1))
        seq1.append(alpha[ahbon])
    seq="".join(seq1)
    return seq
    
def hamming(seq1,seq2):
    count=0
    j=0 
    for i in range(0,len(seq1)-1):
        if (seq1[j] != seq2[j]):
            count=count+1
        j=j+1    
    print (count)
    
def mutate(seq,num_subs):
    seq1=list(seq)
    seq2=list(seq)
    for i in range(num_subs):  
        ahboni=random.randint(0,(len(seq2)-1))
        seq2[ahboni]=randseq(1,alpha)
    return hamming(str(seq1),str(seq2))
    
def experiments(le,su,nb):
    for i in range(nb):
        seq=randseq(le,alpha)
        print (mutate(seq,su))
        data.append(mutate(seq,su))
    return data
    
import math 

def mean(data):
    somme=0
    for i in list(data):
        somme=somme+data[i]
    moyenne=somme/len(data)
    return moyenne

def variance(data):
    k = 0
    for x in data:
        k += 1
        if k == 1:
            M = x
            S = 0
        else:
            Mnext = M + (x - M) / k
            S = S + (x - M)*(x - Mnext)
            M = Mnext
    return (S/(k-1))

def std(data):    
    return math.sqrt(var)

data=[]
alpha="" 
name=str(input("Quel est le type?\n"))
alphabet(name)
le=int(input("Quelle longueur ?\n"))

su=int(input("Combien de substitution dans cette sequence?\n"))
nb=int(input("Combien de fois vous lez vous renouvelez l'experience?\n"))
experiments(le,su,nb)
print ("la liste de distance de hammin est",data)

#STAT
print ("la moyenne est",mean(data))
print ("la variance est",variance(data))
var=variance(data)
print ("le std est",std(data))



Bien a vous !
Afficher la suite 

1 réponse

0
Merci
Bonsoir,

En ce qui concerne ton problème, c'est simple, ta fonction hamming ne retourne rien, alors qu'elle devrait retourner count.

Sinon, si tu ne prends pas en compte ce qui t'a été dit, à quoi ça sert ?
Je t'ai conseillé d'utiliser choice, tu ne le fais pas.
Je t'ai dit que dans un range, il ne fallait pas enlever -1 d'une longueur de chaîne, tu ne l'a pas pris en compte, alors que c'est très important.

Une liste comme
l = [1, 2, 3]
.
Si on fait
[l[i] for i in range(len(l) - 1)]
.
On obtient
[1, 2]
.
Donc ton code dans hamming ne comparera pas la dernière valeur, et ton résultat sera faussé.

Autre chose, tu as fait 2 fonctions mean et variance.
Le module statistics de python propose ces deux fonctions ;)
T'es réponse mon bcp aidé par avant !
Je n'ai le droit d'utiliser que randint, je m'en suis rendu compte hier.. et oui désolée je m'étais trompais de fichier javais bien pris en compte toute tes corrections, mais a force je me perds dans mes fichiers..
Je vais revoir ma fonction hamming
Bonjour,

Désolé alors si tu avais bien prit en compte cela ;)

Je n'ai le droit d'utiliser que randint, je m'en suis rendu compte hier..

Ah donc, c'est un projet ou un exercice à faire.
Je comprends qu'on force les élèves à ne pas utiliser de fonctions trop abouties, mais dans le cas de choice, c'est tout de même du basique.

Si j'étais encore un élève, je mettrai au début de mon code une note comme

# Voici ma propre fonction choice, mais comme le module random fournit cette
# fonction et qu'il est inutile de réinventer la roue, j'utilise dans mon code
# celle du module random
# def choice(seq):
    # i = random.randint(0, len(seq)-1)
    # return seq[i]


Pour montrer au prof qu'on sait faire cette fonction et que forcer à utiliser randint n'est clairement pas pertinent dans le cadre de l'exercice.
Commenter la réponse de khrug