Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/07/2008, à 00:04

binoua

[Resolu]petit probleme de Python[Resolu]

Bonjour,

J'essaie de convertir un programme du C vers Python.
Mon problème est le suivant : en python pour afficher quelque chose a l'écran je ne connais que la méthode
print.

Or je voudrais afficher sur la même ligne des entiers ainsi que le contenu d'un tableau.
Donc je ne peux pas utiliser print puisque print inclue automatiquement un retour chariot.

Une idée ?

Merci

binoua

Dernière modification par binoua (Le 30/07/2008, à 02:13)

Hors ligne

#2 Le 30/07/2008, à 00:14

tiky

Re : [Resolu]petit probleme de Python[Resolu]

Pour ne pas sauter de ligne:

print x, y, z

Cependant cette méthode met des espaces entre chaque variable.
Cette solution correspond à un printf en C.

import sys
sys.stdout.write(x)
sys.stdout.write(y)
sys.stdout.write(z)
sys.stdout.flush()

Dernière modification par tiky (Le 30/07/2008, à 01:25)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#3 Le 30/07/2008, à 00:39

binoua

Re : [Resolu]petit probleme de Python[Resolu]

ok merci

au passage c'est quoi flush ? (flemme de chercher !)

Hors ligne

#4 Le 30/07/2008, à 01:23

binoua

Re : [Resolu]petit probleme de Python[Resolu]

sinon c'est pas os la librairie mais sys wink;)

Hors ligne

#5 Le 30/07/2008, à 01:25

tiky

Re : [Resolu]petit probleme de Python[Resolu]

Exact ! Oups ^^. Flush c'est pour être sûr que tout est bien envoyé à stdout. Il met les données dans un tampon tant qu'il a pas rencontré un saut de ligne en principe ou que le tampon n'est pas plein. Flush provoque l'écriture dans stdout et le vidage du tampon. http://fr.wikipedia.org/wiki/%C3%89criture_bufferis%C3%A9e

Et pour te taquiner aussi, on dit pas librairie mais bibliothèque et on dit module en python ! big_smile

Dernière modification par tiky (Le 30/07/2008, à 01:29)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#6 Le 30/07/2008, à 01:50

binoua

Re : [Resolu]petit probleme de Python[Resolu]

oui c'est vrai je reprend tout le monde à chaque fois qu'on utilise librairie et voila que je le fais !!

Hors ligne

#7 Le 30/07/2008, à 08:36

aleph

Re : [Resolu]petit probleme de Python[Resolu]

>>> 
>>> n = 99
>>> pi = 3.14259
>>> texte = "Python, c'est comme le C"
>>> hexa = 0xff
>>> print ('%i == %f == %s  == %x') % (n, pi, texte, hexa)
99 == 3.142590 == Python, c'est comme le C  == ff
>>>

#8 Le 30/07/2008, à 15:55

binoua

Re : [Resolu]petit probleme de Python[Resolu]

oui mais l'idee c'est que dans le lot il y a le contenu d'un tableau.
Donc a priori cette solution n'est pas idéale

Hors ligne

#9 Le 30/07/2008, à 16:24

aleph

Re : [Resolu]petit probleme de Python[Resolu]

Je pense que si. Mais si tu donnais un petit exemple de ce que tu veux afficher, ce serait mieux. Non ?

#10 Le 30/07/2008, à 18:06

binoua

Re : [Resolu]petit probleme de Python[Resolu]

Et voila.
La premiere colonne c'est le numero de l'iteration dans ma boucle.
Le deuxième c'est un chiffre que je choppe quelque part.
Le reste c'est le contenu d'un tableau.

0       -1      1       0       0       0       0       0       0       0       0       0
1       0       0       1       0       0       0       0       0       0       0       0
2       1       0       0       1       0       0       0       0       0       0       0
3       2       0       0       0       1       0       0       0       0       0       0
4       3       0       0       0       0       1       0       0       0       0       0
5       4       0       0       0       0       0       1       0       0       0       0
6       5       0       0       0       0       0       0       1       0       0       0
7       6       0       0       0       0       0       0       0       1       0       0
8       7       0       0       0       0       0       0       0       0       1       0
9       8       0       0       0       0       0       0       0       0       0       1
10      9       1       0       0       0       0       0       0       0       0       0

Hors ligne

#11 Le 30/07/2008, à 21:01

aleph

Re : [Resolu]petit probleme de Python[Resolu]

> benoua

Vous êtes assez incroyable sur ce forum, jamais capable d'expliquer les choses correctement.
Ce que tu proposes est le *résultat* de ce que tu veux, pas les données que tu veux afficher.

En essayant de disséquer, j'en déduit

- que tu veux afficher l'indice d'itération en supposant que celui-ci ne fasse pas partie des données
- que les données de la 2ème colonne ne font pas partie de la matrice, mais viennent de "quelque part", un vecteur ?
- que le "reste" est un tableau, "une entité en elle-même", une matrice ?

En partant de cela, je propose le code ci-dessous.

A noter: Cette façon de travailler est très "style Python" (et c'est la bonne), elle est nettement plus efficace qu'un parcours de liste avec des indices, comme quelque chose du style:

for row in xrange(len(aa)):
    for ....

Le code; étant donné la structure, j'ai réduit la taille à 5 éléments pour plus de clarté.

>>> aa = [ [1, 0, 0, 0, 0],
           [0, 1, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1] ]
           
>>> b = [-1, 0, 1, 2, 3]
>>> 
>>> for r, row in enumerate(aa):
        print '%5i%5i' % (r, b[r]),
        for c, val in enumerate(row):
            print '%5i' % val,
        print
        
    0   -1     1     0     0     0     0
    1    0     0     1     0     0     0
    2    1     0     0     1     0     0
    3    2     0     0     0     1     0
    4    3     0     0     0     0     1
>>> #sous forme de fonction
>>> def affiche(aa, b):
        t = []
        for r, row in enumerate(aa):
            s = '%5i%5i' % (r, b[r])
            for c, val in enumerate(row):
                s += '%5i' % val
            t.append(s)
        return os.linesep.join(t)
    
>>> print affiche(aa, b)
    0   -1    1    0    0    0    0
    1    0    0    1    0    0    0
    2    1    0    0    1    0    0
    3    2    0    0    0    1    0
    4    3    0    0    0    0    1

Il y a plusieurs façons de travailler, à défaut de plus d'informations, ceci est en une.

#12 Le 30/07/2008, à 21:53

binoua

Re : [Resolu]petit probleme de Python[Resolu]

Sauf ton respect je ne vois pas ce qui n'est pas clair dans "ceci est une variable" et "ceci est un tableau".

Neamoin merci pour ta réponse. Je n'ai pas encore testé mais je ne sais pas si, au final, ta solution n'est pas plus coûteuse.  En effet pour faire la même chose mon code est le suivant :

debut = "%d\t%s\t" %(it,self.num_reac)
f.write(debut)
for i in range(int(self.Ne)) :
	elmt = "%d\t" %(t[i])
	f.write(elmt)
f.write("\n")

Donc à voir.
Merci de ton aide

Dernière modification par binoua (Le 30/07/2008, à 21:54)

Hors ligne

#13 Le 30/07/2008, à 22:25

aleph

Re : [Resolu]petit probleme de Python[Resolu]

> binoua

Pardonne moi, j'ai eu bien du mal à comprendre.

Aucune objection à ta méthode. J'aime bien les solutions propres à Python, "list comprehension", ...

Dans le même ordre d'idée pour écrire des lignes dans un fichier tu utilises

...
f.write(xxx)
...

mais le mieux est de préparer ses lignes dans une liste, puis d'écrire le tout, gain énorme.

...
t = [ligne1, ligne2, ...]
...
f.writelines(t)

Si tu est nouveau dans le monde Python, je ne peux que t'encourager à approfondir ce côté programmation fonctionnelle de Python.

PS

for i in range(len(aa)):  -> for i in xrange(len(aa()):

#14 Le 30/07/2008, à 22:51

binoua

Re : [Resolu]petit probleme de Python[Resolu]

Merci.
J'ai fait un peu de Python auparavant mais c'est vrai que je ne suis pas très au fait de ce qui
est très couteux et ce qui l'est moins.

++

Hors ligne

#15 Le 31/07/2008, à 10:07

aleph

Re : [Resolu]petit probleme de Python[Resolu]

> binoua

Je ne prêche ni pour un langage ni pour un algorithme. Mon intention est de pointer le fait que certaines méthodes plus "exotiques", mais très conviviales, du langage Python ne sont pas aussi "mauvaises" que l'on pense.

>>> timeit.Timer("for i in range(len('abc'*10000)): pass").timeit(1000)
11.9156834414
>>> timeit.Timer("for e in 'abc'*10000: pass").timeit(1000)
9.24381779142
>>> timeit.Timer("for i, c in enumerate('abc'*10000): pass").timeit(1000)
17.4966886862
>>> timeit.Timer("for i in xrange(len('abc'*10000)): pass").timeit(1000)
7.68520477178