Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Débutant] Exercice d'après Swinnen avec une liste : rien ne va plus si un peu corsé

21 réponses
Avatar
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

------------------------------------------------------ programme 1

#-*- 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

------------------------------------------------------ programme 2

#-*- 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

10 réponses

1 2 3
Avatar
chose
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+


Avatar
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.


Avatar
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 !



Avatar
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

Avatar
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


Avatar
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.


Avatar
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...

Avatar
chose
Encolpe Degoute a émis l'idée suivante :

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]


J'ai essayé, mais la console affiche ceci :
« TypeError: list indices must be integers »
Est-ce que la formulation est correcte ?


Avatar
Laurent Pointal
Encolpe Degoute a émis l'idée suivante :

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]


J'ai essayé, mais la console affiche ceci :
« TypeError: list indices must be integers »
Est-ce que la formulation est correcte ?


[1:-1]

Sinon il considère qu'on donne une valeur de tuple (1,-1) comme valeur
d'index.



Avatar
chose
Laurent Pointal a utilisé son clavier pour écrire :
Encolpe Degoute a émis l'idée suivante :

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]


J'ai essayé, mais la console affiche ceci :
« TypeError: list indices must be integers »
Est-ce que la formulation est correcte ?


[1:-1]

Sinon il considère qu'on donne une valeur de tuple (1,-1) comme valeur
d'index.


Voilà ce que cela donne :

for i in a[1:-1] :
if i > a[i] :
c = a[i]
print "Avec saut d'itération et recul :",c

La console affiche une erreur :
« if i > a[i] :
IndexError: list index out of range »

Voici ce qui fonctionne :
for i in a[1:-1] :
if i > a[1:i] :
c = a[i]
print "Avec saut d'itération et recul :",c

Le résultat est correct.
a+




1 2 3