Aide random

-
Bonjour, j'ai une exercice a effectuer, et j'ai un petit soucis, je m'explique :
je dois créer une chaine de proteine aleatoire, créer une chaine de proteine modifier aléatoirement et le nombre de difference qu'il y a entre la proteine crée et celle modifiée (distance de hamming).
voici mon script :
import random
        
def seq_alea(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 difference(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 modification(seq,num_subs):
    seq1=seq2=list(seq)
    seq2=list(seq)
    for i in range(num_subs):  
        ahboni=random.randint(0,(len(seq2)))
        seq2[ahboni]=randseq(1,alpha)
    print (seq1)
    print (seq2)
    return difference(str(seq1),str(seq2))
    
    

alpha="ARNDBCEQZGHILKMFPSTWYV"  
print ("Quelle longueur")
num=int(input())
seq=randseq(num,alpha)


print ("Combien de modif dans cette sequence")
num_subs=int(input())
modification(seq,num_subs)


J'ai deux soucis :
-j'aimerais garder la forme de string dans la premier fonction mais je n'y arrive qu'avec des listes
-lorsque je demande une séquence de 20 puis 10 modification, lorsque qu'il me retourne difference, je n'arrive jamais a trouver exactement les 10 modifications entre les 2 sequence de proteine alors qu'il devrait me les donner.

J'ai essayé pendant de longues heures que l'ensemble fonctionne mais j'ai toujours un petit hic, pourriez vous m'aider ??

En vous remerciant !
Afficher la suite 

2 réponses

Messages postés
8819
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
2 novembre 2019
440
0
Merci
bonjour,
pourquoi devrait-il te donner 10 modifications?
as-tu, dans difference, imprimé seq1, seq2 et count?
où est définie la fonction randseq?
oups randseq est enfait seq_alea, j'ai oublié de la modifier avant de publier le message.
Il devrait me donner 10 modifications car dans la fonction modification je lui en demande 10, il devrait donc les detecter dans la fonction difference
C'est à dire imprimer ?
yg_be
Messages postés
8819
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
2 novembre 2019
440 > latata -
imprimer: print()
Commenter la réponse de yg_be
0
Merci
Bonjour,

J'ai mit des commentaires dans ton code, et montré ce qui ne va pas en les améliorant.

import random

def randseq(num, alpha):
    seq1 = []
    for i in range(num):
        # ahbon=random.randint(0,(len(alpha)-1))
        # Plutôt qu'utliser randint utilise randrange (borne d'arrêt non incluse)
        # ahbon = random.randrange(len(alpha))
        # seq1.append(alpha[ahbon])
        # Mais comme tu as besoin de tirer un élément au hasard parmi alpha
        # Alors choice est plus judicieuw
        seq1.append(random.choice(alpha))
    return "".join(seq1)

def difference(seq1, seq2):
    count = 0
    # j=0 inutile
    # Surtout pas de -1, autrement le dernier élément ne sera pas lu
    # for i in range(0,len(seq1)-1):
    for i in range(len(seq1)):
        # Pas besoin de parenthèses
        if seq1[i] != seq2[i]:
            count += 1
            # j=j+1
            # print (count)
    return count

# Cette fonction doit recevoir également alpha pour savoir sur quoi piocher
# une valeur aléatoire
def modification(seq, num_subs, alpha):
    # Aucun intérêt à assigner à seq2 la même chose que seq1
    # seq1=seq2=list(seq)
    # Et plutôt que de travailler sur la liste, le travail se fait sur les indices
    seq_indices = list(range(len(seq)))
    seq_finale = list(seq)

    for i in range(num_subs):
        # Comme au-dessus on utilise choice mais sur seq_indices
        indice = random.choice(seq_indices)
        # suppression dans la liste pour ne pas le piocher 2 fois
        seq_indices.remove(indice)
        # Choix du remplacement
        valeur = random.choice(alpha)
        # Et finalement Remplacement dans la seq_finale
        seq_finale[indice] = valeur
        # ahboni=random.randint(0,(len(seq2)))
        # seq2[ahboni]=randseq(1,alpha)
        # print (seq1)
        # print (seq2)
    # C'est pas ici que tu dois retourner la différence
    # Ou alors j'ai pas compris ce que dois faire cette focntion
    # D'où l'intérêt de nommer avec un nom représentatif les fonctions
    # return difference(str(seq1),str(seq2))
    return ''.join(seq_finale)

# Sachant que l'on souhaite modifier x éléments dans n éléments
# Alors on peut raccourcir cette fonction en utilisant random.sample
def modification(seq, num_subs, alpha):
    seq_indices = random.sample(range(len(seq)), num_subs)
    seq_finale = list(seq)
    for i in seq_indices:
        valeur = random.choice(alpha)
        seq_finale[i] = valeur
    return ''.join(seq_finale)


alpha = "ARNDBCEQZGHILKMFPSTWYV"
# input peut reçcevoir une chaîne à afficher.
# print("Quelle longueur")
num = int(input("Quelle longueur ?\n"))
seq = randseq(num,alpha)
# print ("Combien de modif dans cette sequence")
num_subs = int(input("Combien de modif dans cette sequence ?\n"))
seq_modifiee = modification(seq, num_subs, alpha)
print(seq)
print(seq_modifiee)
print('nombre de différences :', difference(seq, seq_modifiee))
Merci pour ta reponse ! Pour un petit nombre (60 et 12 modif, cela marche bien, merci :)
cependant il m'est demandé de faire une seq de 1000 lettre avec 100 modif, lorsque je le fais avec ton script, le nombre de modification donnée est 95 par la suite, c'est justement ça que je cherche à faire :)

En te remerciant !
> latata -
Il y a ce problème auquel je n'avais pas pensé, est qu'il y a une chance sur 26 d'obtenir la même lettre ^^

Je te laisse donc deviner comment exclure de la lettre à choisir parmi alpha celle de la séquence initiale.

Note que l'idéal serait de travailler avec des sets, ce serait bien plus facile.
D'accord je vais essayer ça. Merci beaucoup !!
yg_be
Messages postés
8819
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
2 novembre 2019
440 > latata -
par ailleurs, les deux programmes peuvent changer plusieurs fois la même position, il est donc normal que le nombre de changements soit supérieur au nombre compté à la fin.
imagine que tu aies 100 positions et que tu fasses 1000 modifs.
Commenter la réponse de khrug