Alignement, ecriture dans fichier
Bonjour, pour un projet je dois aligner deux séquences entre elles mais il s'agit ici juste d'une facon esthetique de presenter l'alignement, et non pas d'un alignement local, global ou autre.
J'ai écrit ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
def pretty(file,idx,idy,s,x,y):
f = open (file,"w")
res = ""
for x,y in zip (idx,idy):
if x == y :
res += x "/n" + "|" + "/n" y
else:
res += x "/n" + "-" + "/n" y
f.close()
return res |
Ma logique étant la suivante :
on parcourt la sequence idx et la sequence idy en meme temps,
si le caractere x de idx == le caractere y de idy alors on ecrit :
x a la ligne, la barre, a la ligne y
si x est different de y on ecrit :
x a la ligne, tiret, y
par exemple :
idx = ATGA
idy = ACGT
pour le premier caractere de idx et idy on a x = A, y = A donc le resultat :
A
|
A
puis on continu et aboutit a :
ATGA
| - |-
ACGT
Mais ca ne fonctionne pas, je ne comprends pas pourquoi. Est ce ma logique qui est fausse ou alors mon code ?
Merci.
correction bug l2 + fonction tant qu'a faire.
Salut,
Maintenant que cette fonction "marche":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def pretty(idx,idy):
l1 = []
l2 = []
l3 = []
for x,y in zip (idx,idy):
if x == y:
l1.append(x)
l2.append('|')
l3.append(y)
else:
l1.append(x)
l2.append('-')
l3.append(y)
for e in l1,l2,l3:
print "".join(e) |
Afficher plusieurs lignes lorsque les longueurs d'idx, idy sont >80, c'est expédier a pretty des "tranches" d'idx, idy.
Avant de se lancer la dedans, il faut apprendre a découper en tranches, i.e. jouer avec:
Code:
1 2 3 4
| >>> S = '01234567890123456789'
>>> size = 2
>>> for x in range(0, len(S), size):
.... print (S[x:x+size]) |
regarder ce qu'il se passe lorsque len(S) n'est pas multiple de size.
Puis appliquer votre fonction "pretty" aux tranches construites avec idx, idy.
Le code de pretty n'est pas beau? Il fonctionne et c'est vous qui l'avez écrit. Apprenez a le réutiliser avant de "modifier", "ameliorer".
La seule amélioration a faire pourrait être d'y supprimer des bavardages et d'en faire une "vrai" fonction, i.e qui retourne le "texte" construit:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def pretty(idx,idy):
# l1 = []
l2 = []
# l3 = []
for x,y in zip (idx,idy):
if x == y:
# l1.append(x)
l2.append('|')
# l3.append(y)
else:
# l1.append(x)
l2.append('-')
# l3.append(y)
# for e in idx,l2,idy:
l2 = ''.join(l2)
return "\n".join( [ idx,l2,idy ]) |
note: L1, L2, L3 n’étaient la que pour vous permettre de visualiser le travail a faire sur chacune des 3 lignes. Cela compris, plus besoin de les trimbaler dans le code.
- W