Problèmes programme python

Fermé
honey - 22 nov. 2009 à 16:41
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 24 nov. 2009 à 11:49
Bonjour, je fais un programme pour résoudre des grilles de sudoku en python (sous windows vista) mais je suis confrontée à 2 problèmes:
la fonction est bonne mais je n'arrive pas à lire un fichier texte :

def lire ('../grille1.txt'):
lgrille=[]
fp=open ('../grille1.txt','r')
ligne=fp.readline()
while ligne:
l=ligne.split()
lgrille.append([])
for e in l:
lgrille [-1].append(int(e))
ligne=fp.readline
fp.close()
return lgrille


print lire()



Puis j'ai une autre fonction pour afficher la grille mais ça ne m'affiche pas les lignes, tous les éléments sont les uns en dessous des autres (sauf pour afficheSeparateur):

def afficheSeparateur ():
print ("-"*25)


def afficheLigne(l):
for e in range (9):
if e%3==0:
print ("|")
if l[e]==0:
print (".")
else:
print (l[e])
print ("|")


def afficher (l):
for e in range (9):
if e%3==0:
afficheSeparateur()
afficheLigne (l[e])
afficheSeparateur()


l=[[0,0,9,0,0,0,0,0,0],[0,1,0,0,0,0,4,8,0],[0,4,0,3,8,5,0,0,0],[5,0,0,0,0,2,0,3,0],[0,0,0,0,5,0,7,9,1],[0,0,1,7,0,9,0,2,4],[0,0,0,0,4,3,0,0,5],[0,0,2,0,9,7,0,1,8],[0,0,0,0,0,0,0,0,0]]
afficher(l)


J'ai vraiment besoin d'aide c'est un devoir à rendre. Merci beaucoup d'avance !

4 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
23 nov. 2009 à 13:44
je ne comprend pas pourquoi je dois mettre les parenthèses pour les print sinon ça ne fonctionne pas.
C'est certainement parce que tu es sous Python 3, alors que je suis toujours sous Python 2.6
https://www.local-guru.net/blog/2009/02/09/whats-new-in-python-3-0
http://docs.python.org/dev/3.0/whatsnew/3.0.html

-------------------------------------------

Tu ne veux pas remplacer
        l=ligne.split()
        lgrille.append([]) 
        for e in l: 
            lgrille [-1].append(int(e))

par
        l=ligne.split()
        sous-liste = [ int(u) for u in l ]
        lgrille.append(sous-liste)

?

On peut même condenser en
        l=ligne.split()
        lgrille.append([ int(u) for u in l ])

et on peut même aller jusqu'à

def lire (fic): 
    lgrille=[] 
    fp=open (fic,'r') 
    ligne=fp.readline()
    while ligne: 
        lgrille.append([int(u) for u in ligne.split()]) 
        ligne=fp.readline()
    fp.close() 
    return lgrille 

C'est clean , non ?






Si ça ne te plait pas, on peut aussi procéder autrement.
Est-ce que tu connais la fonction map() ?
Regarde ce qui se passe par exemple avec
li = ['23','4','123','890','45']
print li
li = map(int,li)
print li


map(f,li) applique la fonction f sur chaque élément de li et renvoie la liste li transformée

Donc dans ton cas, on peut s'en servir pour écrire

def lire1 (fic): 
    lgrille=[] 
    fp=open (fic,'r') 
    ligne=fp.readline()
    while ligne: 
        l=map(int,ligne.split())
        lgrille.append(l) 
        ligne=fp.readline()
    fp.close() 
    return lgrille


et en condensant:

def lire1 (fic): 
    lgrille=[] 
    fp=open (fic,'r') 
    ligne=fp.readline()
    while ligne: 
        lgrille.append(map(int,ligne.split())) 
        ligne=fp.readline()
    fp.close() 
    return lgrille 



Comme ça , il n'y a même pas de création de l, ses valeurs sont immédiatement traitées par map().

--------------

Pour l'affichage, y a de l'idée, mais ça cafouille un peu.

D'abord, si tu fais renvoyer lgrille par la fonction lire(), et l'imprimer par print lire(...), certes tu as l'écriture de lgrille à l'écran. Mais une fois ceci fait, lgrille ne se trouve plus accessible parce que c'était une variable locale, c'est à dire interne a lire().

Donc il faut l'enregistrer à l'extérieur:
Faire
lgrille = lire(...)
print lgrille




Ensuite je ferais comme ça:
- afficher "-"*25
- pour chaque sous-liste de lgrille (c'est à dire une ligne), afficher la succession de chiffres et de '|' c'est à dire la ligne de chiffres proprement dite bien formatée
puis en dessous afficher "-"*25

Il faut savoir que sous Python 2.6 en tous cas, print fait revenir à la ligne donc
            print (l[e]) 
            print ("|") 

va malheureusement faire afficher
l[e] sur une ligne
puis '|' à la ligne suivante
Pour contrecarrer ça, il faut faire
            print (l[e]),("|") 

La virgule empêche le retour à la ligne. Ça marche aussi si on écrit
            print (l[e]),
            print ("|") 


Mais il reste un ennui: print a,b fait affichér a et b avec touours un blanc entre les deux.
Pour éviter ceci il faut alors écrire print a+b, mais cela n'est possible que si a et b sont des chaînes. Si b est un entier par exemple, il suffit d'écrire print a+str(b).

Et hop.


Ceci dit, Python 3 a vu une augmentation notable des possibilités de la fonction print, et les pratiques sont sans doute différentes et plus simples à mettre en place. À toi de regarder tout ça et de te débrouiller avec mes indications pour arriver à écrire ta fonction d'affichage.



Pense aussi au fait que Python permet de jouer très facilement avec des indices.
Par exemple
l = [0,0,1,4,0,3,0,3,8]
for i in (0,3,6):
    print l[i:i+3],


Allez, j'arrête là, on peut dire des tonnes de choses encore.

------------------------

pour garder l'indentation des lignes qui sont du code, dans le message ue tu postes, il faut sélectionner les lignes en question et appuyer sur le bouton à icône de page blanche qui se trouve juste après les icônes G I S
1