TD1_correction_2012.py #Exercice 1.A # fonction qui avec un entier

publicité
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
Téléchargement