Aide random
latata
-
bcleo -
bcleo -
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 :
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 !
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 !
2 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour,
pourquoi devrait-il te donner 10 modifications?
as-tu, dans difference, imprimé seq1, seq2 et count?
où est définie la fonction randseq? -
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 ! -
-
-