TD1_correction_2012.py #Exercice 1.A # fonction qui avec un entier annee renvoie une string B ou NB def bissextile(a): if a%4 != 0: rep=" NB" elif a%100 == 0 and a%400 == 0: rep=" B" elif a%100 != 0: rep=" B" else: rep=" NB" return rep # debut pg principal a=input("Entrez une annee: ") # transforme en int car input renvoie une string a=int(a) b=bissextile2(a) print("l'annee %d est %s"%(a,b)) # pour eviter de perdre la fenetre en cas d'execution automatique tutu=input("taper sur ENTREE pour terminer") #Exercice 1.A # autre version # fonction qui renvoie un bool a partir d'un entier annee def is_bissextile(annee): biss=0 if annee%4 == 0 and annee%100 !=0 or annee%400==0: biss=1 else : biss=0 return biss # pg principal an=int(input("Entrez l'annee a tester")) biss=is_bissextile(an) if biss : verbe= "est" else : verbe="n'est pas" phrase="l'annee "+ str(an) + " "+ verbe + " bissextile"+ "\n" print(phrase) a=input("appuyer sur enter pour terminer") #Exercice 1.B #Exercice 1.B #fonction qui charge toutes les lignes d'un fichier dans une liste def load(nomfich): f=open(nomfich, "r") data=f.readlines() f.close() return data # fonction qui renvoie dans une liste les positions des espaces a partir d'une string def space(s): pos=[] for i in range(0, len(s)): #balaye la chaine et recupere l'indice qd == espace if s[i] == " ": pos=pos+[i] return pos Page 1 TD1_correction_2012.py # fct qui construit un dico[Ville1 Ville2]= distance def build_dico(data): dico={} for ligne in data: # appel de la fonction space pour chaque elem de ma liste data (=chaque ligne) position=space(ligne) #recup de la ville1 avec le 1er espace ville1=ligne[:position[0]] #recup de la ville2 avec 2eme espace ville2=ligne[position[0]+1:position[1]] #construction de la cle avec ville1 et ville2 cle=ville1+" "+ville2 # recup de la distance (encore en string) sans le retour chariot (-1) dist=ligne[position[1]+1:-1] dico[cle]=dist return dico #fct qui renvoie le trajet (cle) et la distance mini def min_dist(dico): mini=3000000000000000 for cle in dico: if float(dico[cle]) < mini: #obligation de convertir la string en float mini=float(dico[cle]) trajet_mini=cle return trajet_mini, mini #fct qui renvoie le trajet (cle) et la distance maxi def max_dist(dico): maxi=0 for cle in dico: if float(dico[cle]) > maxi: maxi=float(dico[cle]) trajet_maxi=cle return trajet_maxi, maxi def search_city(dico,ville): l=[] for cle in dico: if ville in cle: l=l+[[cle, dico[cle]]] #l.append([cle, dico[cle]]) return l def write_file(res, outputfile): f=open(outputfile,"w") for ligne in res: f.write(" ".join(ligne)+"\n") #f.write(ligne[0]+" "+ligne[1]+"\n") f.close() ####### debut du pg result=load("villes.txt") #print pour debug #print(result) dicovilles=build_dico(result) #print pour debug #print(dicovilles) #recup dans 2 variables su trajet min et de la dist min traj_min, distmin=min_dist(dicovilles) print(traj_min, distmin) traj_max, distmax=max_dist(dicovilles) print(traj_max, distmax) Page 2 TD1_correction_2012.py ville=input("Nom de la ville: ?").upper() resville=search_city(dicovilles,ville) #print(resville) #print(len(resville)) if len(resville) > 0: file=input("Nom de fichier resultats: ?") write_file(resville,file) else: print("Pas trouve") # # # # version avec toutes vos connaissances: exo villes vu au début du cours 1 Exercice villes conforme python 3 R. Gautier 2010 # fonction qui va lire le contenu du fichier et retourner une liste de ligne def load_file_split(filename, sep=" "): f=open(filename, "r") lignes=f.readlines() # lit toutes les lignes et met dans une liste ligne par ligne f.close() for i in range(0, len(lignes)): lignes[i]=lignes[i].upper() lignes[i]=lignes[i].split(sep) return lignes # construit un dictionnaire avec en cle les trajets et en valeur les distances def build_dico(lignes): dico={} for ligne in lignes: #print ligne cle=" ".join(ligne[:2]) # join la liste en une string dico[cle]=ligne[-1][:-1] # attention a enlever le \n return dico # recherche la distance mini entre deux villes dans le dico def min_dist(dico): mini=1000000000000.0 # attention parametrage autre solution mettre la premiere valeur trajetMini="" for cle in dico: if float(dico[cle]) < mini: mini=float(dico[cle]) trajetMini=cle return trajetMini, mini # recherche de la distance maxi def max_dist(dico): maxi=0.0 trajetMaxi="" for cle in dico: if float(dico[cle]) > maxi: maxi=float(dico[cle]) trajetMaxi=cle return trajetMaxi, maxi # recherche une ville en particulier dans la cle du dico def search_city(dico, city): listes=[] for cle in dico: if city in cle: listes.append([cle,dico[cle]]) # pour l'instant pas possible de faire mieux return listes Page 3 TD1_correction_2012.py # # Pg principal (main) name=input("Entrez le nom du fichier: ") #data=load_file_split(name) try: data=load_file_split(name) #print data, len(data) except: print("Impossible d'ouvrir le fichier %s "%(name)) a=input("Tapez sur entree pour terminer") else: # construction dico distances=build_dico(data) # print distances, len(distances) maxi=max_dist(distances) mini=min_dist(distances) print("Distance la plus grande est de %.2f km pour %s "%(float(maxi[1]),maxi[0])) print("Distance la plus petite est de %.2f km pour %s "%(float(mini[1]),mini[0])) # on s'interesse a une ville en particulier city=input("Entrez le nom de la ville: ").upper() result=search_city(distances, city) if len(result) != 0: for l in result: print("Distante %s = %.2fkm"%(l[0], float(l[1]))) else: print("Ville %s non trouve"%(city)) a=input("Tapez sur entree pour terminer") #Exercice 1.C # fonction qui lit un fichier fasta def load_fasta(nomfich): try: f=open(nomfich,"r") except: print("impossible d'ouvrir le fichier %s"%(nomfich)) return "" else: listseq=[] ligne=f.readline() while ligne != "": if ligne[0] != ">": ligne=ligne.strip() listseq.append(ligne) ligne=f.readline() f.close() seq="".join(listseq) return seq.upper() # fonction qui avec une seq (string) va renvoyer un dico de dinucleotide def build_dico(sequence): dico={} for i in range(0, len(sequence)-1): cle=sequence[i:i+2] if cle in dico: dico[cle]=dico[cle]+1 else: dico[cle]=1 return dico # calcule le pourcentage de GC dans une sequence (string) def pourCG(sequence): CG=0 Page 4 TD1_correction_2012.py for base in sequence: # 2 solutions if nucl in "GC": #if base == "C" or base =="G": CG=CG+1 pCG= (CG/len(sequence))*100 return pCG # renvoir la temp de fusion a partir du pourc GC def temp_fusion(pCG): return 70+0.44*pCG # procedure qui affiche les resultats def affichres(dico, seq): somme=0 for cle in dico: print("%s %i %.3f"%(cle, dico[cle], dico[cle]/(len(seq)-1))) somme=somme+dico[cle]/(len(seq)-1) print(somme) #procedure qui ecrit les résultats dans un fichier def writeres(file,dico, seq): f=open(file,"w") for cle in dico: f.write("%s %i %.3f \n"%(cle, dico[cle], dico[cle]/(len(seq)-1))) pcg=pourc(seq) f.write("Le pourcentage de GC est de %.2f\n"%(pcg)) f.write("La temperature de fusion est de %.3f \n"%(tempfusion(pcg))) f.close() # debut pg file=input("Entrez le nom du fichier: ") seq=load_fasta(file) #seq=load_fasta("NC_000908-M.fna") if seq != "": dico2L=build_dico(data) #print(dico2L) affichres(dico2L, seq) pGC=pourc(seq) #print(pGC) temp=tempfusion(pGC) #print(temp) f_out=input("Nom du fichier output: ") writeres(f_out, dico2L, seq) input("Tapez sur Entree pour terminer") Page 5