[Débutant] Exercice d'après Swinnen avec une liste : rien ne va plus si un peu corsé
21 réponses
chose
Bonjour,
Je débute avec le livre de M. Swinnen, je suis arrivé à l'exercice sur
les listes (PDF, page 54) :
#Exercice 5.13 : Écrivez un programme qui recherche le plus grand
#élément présent dans une liste donnée. Par exemple, si on l'appliquait
#à la liste [32, 5, 12, 8, 3, 75, 2, 15], ce programme devrait afficher
#: le plus grand élément de cette liste a la valeur 75.
Je l'ai réussi avec [32, 5, 12, 8, 3, 75, 2, 15].
Mais quand j'utilise raw_input pour des listes sur mesure,
rien ne va plus.
J'ai testé deux variantes qui donnent toutes les deux un résultat
erroné. Je suis curieux de connaître la raison de cette erreur.
Le code est simple pour les habitué(e)s, un coup d'oeil de votre part
me ferait plaisir et m'aidera certainement. Merci.
a+
Chose
#-*- coding:latin-1 -*-
a=[]
print "Nombre d'items dans la liste ?"
b=int(raw_input())
print "Va pour", b, "items"
i = 0
while i < b:
a.append(raw_input())
i = i + 1
d=len(a)
i =0
c=0
print a
while i < d:
if int(a[i]) > c:
c = a[i]
print c
i = i+1
print "Le plus grand élément de la liste a la valeur de", c
------------------------------------------------------ résultat de 1
Voici le résultat :
Nombre d'items dans la liste ?
7
Va pour 7 items
14
5
16
3
25
4
60
['14', '5', '16', '3', '25', '4', '60']
14
Le plus grand élément de la liste a la valeur de 14
#-*- coding:Latin-1 -*-
a=[]
print "Nombre d'items dans la liste ?"
b=int(raw_input())
print "Va pour", b, "items"
i = 0
while i < b:
a.append(raw_input())
i = i + 1
d=len(a)
i =0
c=0
print a
while i < d:
if a[i] > c: #j'ai changé ici
c = a[i]
print c
i = i+1
print "Le plus grand élément de la liste a la valeur de", c
------------------------------------------------------ résultat de 2
Nombre d'items dans la liste ?
7
Va pour 7 items
14
5
16
3
25
4
60
['14', '5', '16', '3', '25', '4', '60']
14
5
60
Le plus grand élément de la liste a la valeur de 60
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que c'est zéro la valeur maximale. Pourtant avec une condition comme : if i < -5: i=int(i) c=i print c la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur négative. Donc le résultat est 0. Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît pas en python. Il y a des chances pour que ce soit -(2^(32 - 1)) pour un python 32bits et -(2^(64 - 1)) pour un python 64bits mais je dis peut-être une bêtise...
Nicolas
J'ai mis modestement "c=-100" et ça roule ! Merci à tous pour ces leçons de python bien intéressantes. a+
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que
c'est zéro la valeur maximale. Pourtant avec une condition comme :
if i < -5:
i=int(i)
c=i
print c
la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur
négative. Donc le résultat est 0.
Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur
qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît
pas en python. Il y a des chances pour que ce soit -(2^(32 - 1)) pour un
python 32bits et -(2^(64 - 1)) pour un python 64bits mais je dis peut-être
une bêtise...
Nicolas
J'ai mis modestement "c=-100" et ça roule !
Merci à tous pour ces leçons de python bien intéressantes.
a+
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que c'est zéro la valeur maximale. Pourtant avec une condition comme : if i < -5: i=int(i) c=i print c la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur négative. Donc le résultat est 0. Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît pas en python. Il y a des chances pour que ce soit -(2^(32 - 1)) pour un python 32bits et -(2^(64 - 1)) pour un python 64bits mais je dis peut-être une bêtise...
Nicolas
J'ai mis modestement "c=-100" et ça roule ! Merci à tous pour ces leçons de python bien intéressantes. a+
Laurent Pointal
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que c'est zéro la valeur maximale. Pourtant avec une condition comme : if i < -5: i=int(i) c=i print c la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur négative. Donc le résultat est 0. Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît pas en python. Il y a des chances pour que ce soit -(2^32 - 1) pour un python 32bits et -(2^64 - 1) pour un python 64bits mais je dis peut-être une bêtise...
Je serais plutôt parti avec quelque chose comme (en considérant que les valeurs ont déjà été transtypées en int):
c = a[0] for i in a[1:] : if i > c : c = i
A+
Laurent.
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit
que c'est zéro la valeur maximale. Pourtant avec une condition comme :
if i < -5:
i=int(i)
c=i
print c
la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une
valeur négative. Donc le résultat est 0.
Si tu veux que ça marche, il faut initialiser c avec la plus petite
valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne
la connaît pas en python. Il y a des chances pour que ce soit -(2^32 -
1) pour un python 32bits et -(2^64 - 1) pour un python 64bits mais je
dis peut-être une bêtise...
Je serais plutôt parti avec quelque chose comme (en considérant que les
valeurs ont déjà été transtypées en int):
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que c'est zéro la valeur maximale. Pourtant avec une condition comme : if i < -5: i=int(i) c=i print c la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur négative. Donc le résultat est 0. Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît pas en python. Il y a des chances pour que ce soit -(2^32 - 1) pour un python 32bits et -(2^64 - 1) pour un python 64bits mais je dis peut-être une bêtise...
Je serais plutôt parti avec quelque chose comme (en considérant que les valeurs ont déjà été transtypées en int):
c = a[0] for i in a[1:] : if i > c : c = i
A+
Laurent.
chose
Laurent Pointal avait prétendu :
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que c'est zéro la valeur maximale. Pourtant avec une condition comme : if i < -5: i=int(i) c=i print c la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur négative. Donc le résultat est 0. Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît pas en python. Il y a des chances pour que ce soit -(2^32 - 1) pour un python 32bits et -(2^64 - 1) pour un python 64bits mais je dis peut-être une bêtise...
Je serais plutôt parti avec quelque chose comme (en considérant que les valeurs ont déjà été transtypées en int):
c = a[0] for i in a[1:] : if i > c : c = i
A+
Laurent.
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Laurent Pointal avait prétendu :
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit
que c'est zéro la valeur maximale. Pourtant avec une condition comme :
if i < -5:
i=int(i)
c=i
print c
la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une
valeur négative. Donc le résultat est 0.
Si tu veux que ça marche, il faut initialiser c avec la plus petite
valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne
la connaît pas en python. Il y a des chances pour que ce soit -(2^32 -
1) pour un python 32bits et -(2^64 - 1) pour un python 64bits mais je
dis peut-être une bêtise...
Je serais plutôt parti avec quelque chose comme (en considérant que les
valeurs ont déjà été transtypées en int):
c = a[0]
for i in a[1:] :
if i > c :
c = i
A+
Laurent.
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de
la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Pour les nombres négatifs, j'ai essayé, cela ne marche pas, il me dit que c'est zéro la valeur maximale. Pourtant avec une condition comme : if i < -5: i=int(i) c=i print c la boucle trie correctement les valeurs négatives.
Et c'est normal. Dans l'algo de départ, 0 est toujours supérieur à une valeur négative. Donc le résultat est 0. Si tu veux que ça marche, il faut initialiser c avec la plus petite valeur qui existe pour un entier. Et je ne te la donnerais pas car je ne la connaît pas en python. Il y a des chances pour que ce soit -(2^32 - 1) pour un python 32bits et -(2^64 - 1) pour un python 64bits mais je dis peut-être une bêtise...
Je serais plutôt parti avec quelque chose comme (en considérant que les valeurs ont déjà été transtypées en int):
c = a[0] for i in a[1:] : if i > c : c = i
A+
Laurent.
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Encolpe Degoute
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Vous devriez essayer a[1,-1]
-- Encolpe DEGOUTE http://encolpe.degoute.free.fr/ Logiciels libres, hockey sur glace et autres activités cérébrales
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de
la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Vous devriez essayer a[1,-1]
--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Vous devriez essayer a[1,-1]
-- Encolpe DEGOUTE http://encolpe.degoute.free.fr/ Logiciels libres, hockey sur glace et autres activités cérébrales
Boris Borcic
chose wrote:
print max(int(x) for x in iter(raw_input,''))
Là je nage, c'est pas grave, faut que j'avance.
iter(f,sentinelle) est un iterateur qui va invoquer f() et retourner la valeur obtenue jusqu'à ce que f()==sentinelle.
Donc iter(raw_input,'') va retourner des lignes d'input jusqu'à ce qu'o n entre une ligne vide.
Ainsi max(int(x) for x in iter(raw_input,'')) va calculer le max des valeurs entières int(x) des lignes d'input x entrées jusqu'à une ligne vide qui signalera la fin des données.
hth
chose wrote:
print max(int(x) for x in iter(raw_input,''))
Là je nage, c'est pas grave, faut que j'avance.
iter(f,sentinelle) est un iterateur qui va invoquer f() et retourner
la valeur obtenue jusqu'à ce que f()==sentinelle.
Donc iter(raw_input,'') va retourner des lignes d'input jusqu'à ce qu'o n
entre une ligne vide.
Ainsi max(int(x) for x in iter(raw_input,'')) va calculer le max
des valeurs entières int(x) des lignes d'input x entrées jusqu'à
une ligne vide qui signalera la fin des données.
iter(f,sentinelle) est un iterateur qui va invoquer f() et retourner la valeur obtenue jusqu'à ce que f()==sentinelle.
Donc iter(raw_input,'') va retourner des lignes d'input jusqu'à ce qu'o n entre une ligne vide.
Ainsi max(int(x) for x in iter(raw_input,'')) va calculer le max des valeurs entières int(x) des lignes d'input x entrées jusqu'à une ligne vide qui signalera la fin des données.
hth
Laurent Pointal
Je serais plutôt parti avec quelque chose comme (en considérant que les valeurs ont déjà été transtypées en int):
c = a[0] for i in a[1:] : if i > c : c = i
A+
Laurent.
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Ceci dit, à la réflexion, il vaut peut-être mieux initialiser c à a[0] et itérer sur toute la liste... en sachant d'avance le résultat de la première itération.
Car a[1:] crée une nouvelle liste... ça peut devenir couteux si c'est répété souvent ou sur de grandes listes.
A+
Laurent.
Je serais plutôt parti avec quelque chose comme (en considérant que les
valeurs ont déjà été transtypées en int):
c = a[0]
for i in a[1:] :
if i > c :
c = i
A+
Laurent.
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de
la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Ceci dit, à la réflexion, il vaut peut-être mieux initialiser c à a[0]
et itérer sur toute la liste... en sachant d'avance le résultat de la
première itération.
Car a[1:] crée une nouvelle liste... ça peut devenir couteux si c'est
répété souvent ou sur de grandes listes.
Je serais plutôt parti avec quelque chose comme (en considérant que les valeurs ont déjà été transtypées en int):
c = a[0] for i in a[1:] : if i > c : c = i
A+
Laurent.
Joli. Donc les deux-points dans a[1:] servent à débuter l'itération de la liste à partir de 1 au lieu de 0. On en apprend des choses ici !
Ceci dit, à la réflexion, il vaut peut-être mieux initialiser c à a[0] et itérer sur toute la liste... en sachant d'avance le résultat de la première itération.
Car a[1:] crée une nouvelle liste... ça peut devenir couteux si c'est répété souvent ou sur de grandes listes.
A+
Laurent.
NicolasP
Car a[1:] crée une nouvelle liste... ça peut devenir couteux si c'est répété souvent ou sur de grandes listes.
Remarque très pertinente...
Car a[1:] crée une nouvelle liste... ça peut devenir couteux si c'est
répété souvent ou sur de grandes listes.