PYTHON : liste décroissante

Discutez d'informatique ici !
nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

PYTHON : liste décroissante

par nico10310 » 15 Nov 2016, 18:42

Bonjour,

Voici mon énoncé :
Ecrire un programme qui détermine si une liste de float est triée par ordre décroissant. Si oui, on affiche -1, sinon on affiche à partir de quelle position elle n'est plus décroissante. La liste est saisie en entrée.
Entrée du programme : Une liste de float.
Sortie du programme : Un entier

Exemples :
Entrée :
[60.5, 59.2, 59.0, 59.0, 60.9, 61.0, 60.5, 60.1, 59.3,61.0]
Sortie :
4
Entrée :
[60.5, 59.5, 59.2, 59.0]
Sortie :
-1

Et voici ce que j'ai fait :
l=eval(input())
i=0

while i <= (len(l)-2) and l[i]>l[i+1] :
if l[i]>l[i+1]:
i=i+1
if i+2==len(l) :
print(-1)
else :
print(l[i])


Mais il ne marche pas tous le temps. Que faire ?
Merci pour votre aide



Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21512
Enregistré le: 11 Nov 2009, 22:53

Re: PYTHON : liste décroissante

par Ben314 » 15 Nov 2016, 18:59

Salut,
Déjà, je recopie ton programme vu que la façon dont tu l'a saisie ne permet pas de voir les indentation (en mode "pur texte", les espaces de début de ligne sont supprimés) :
Code: Tout sélectionner
l=eval(input())
i=0

while i <= (len(l)-2) and l[i]>l[i+1] :
    if l[i]>l[i+1]:
        i=i+1
        if i+2==len(l) :
           print(-1)
    else :
        print(l[i])
Ensuite, selon toi, ç'est quoi le fonctionnement d'une boucle "while" ?
Ou, si tu préfère, il fait quoi (ligne par ligne) ton programme si la liste est, par exemple, [1 , 5 , 4 , 3]
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 15 Nov 2016, 19:13

Il regarde si l'élément d'indice i est sup. à celui d'indice i+1 tant que le compteur est inf à la, longueur de la liste (le -2 ne sert à rien en fait)
Avec [1 , 5 , 4 , 3] il affiche "None"

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: PYTHON : liste décroissante

par fatal_error » 15 Nov 2016, 21:06

je te suggère de suivre l'instruction il fait quoi (ligne par ligne) donnée par ben parce que ca fait partie de l'apprentissage pour débugger.

maintenant, une alternative qui t'évite de perdre des cheveux c'est les bonnes pratiques.

1) Tu souhaites quitter ta boucle (l[i]>l[i+1]).
Préfères une variable qui vaut true (pour rentrer au moins la première fois) et laisse le sein de ton while setter cette variable à false si tu veux quitter la boucle.

2) Dissocie l'affichage du calcul. Ta boucle doit retourner: soit -1, soit un index. Elle ne doit pas afficher de résultat. Donc épargnes tes print dans le while, et n'affiche le print QUE à la fin de ta boucle.

Code: Tout sélectionner
indexCourant = 0
indexFin = len(l)-1
//de base, on considère la liste décroissante, donc on affichera -1
indexElementCroissant = -1
elementSuivantDecroissant = True
while indexCourant <= indexFin-1 && elementSuivantDecroissant:
   #note: inutile d'etre cryptique, si tu manipules l[i] dis que tu manipules l'element courant
   elemCourant = l[indexCourant]
   elemSuivant = l[indexCourant+1]
   if elemCourant < elemSuivant:
      //on a trouvé un élément croissant: on veut quitter la boucle, on sette à False
      elementSuivantDecroissant = False
      //finalement on affichera lindex du premier element non décroissant
      indexElementCroissant = indexCourant+1
   #peu importe qu'on aie trouve un element ou pas, on va à la suite...
   indexCourant++

print indexElementCroissant

moyennant la syntaxe...

pour info, on peut avoir un oneliner :D:
Code: Tout sélectionner
print(next((i for i in range(len(L)-1) if L[i]<L[i+1]), -2)+1)
la vie est une fête :)

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 16 Nov 2016, 10:44

J'ai compris
Merci beaucoup !

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 16 Nov 2016, 11:34

C'est bizarre, le programme semble correcte mais je n'ai que 25% de bonne réponse ...

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 16 Nov 2016, 11:58

Code: Tout sélectionner
l=input()
indexCourant = 0
indexFin = len(l)-1
indexElementCroissant = -1
elementSuivantDecroissant = True
while indexCourant <= indexFin-1 and elementSuivantDecroissant:
   elemCourant = l[indexCourant]
   elemSuivant = l[indexCourant+1]
   indexCourant=indexCourant+1
   if elemCourant < elemSuivant :
      elementSuivantDecroissant = False
      indexElementCroissant=indexCourant
   

print(indexElementCroissant)

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: PYTHON : liste décroissante

par fatal_error » 16 Nov 2016, 21:01

que fais-tu pour comprendre d'ou viendrait l'erreur?
la vie est une fête :)

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 17 Nov 2016, 15:23

Je vais sur pytthontutor (http://pythontutor.com/)
Je ne vois pas pourquoi avec certaines listes entrées le programme marche alors qu'avec d'autres non.
Merci de m'éclairer

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: PYTHON : liste décroissante

par fatal_error » 18 Nov 2016, 00:26

sérieux t'as l'affichage de la valeur des variables pendant que tu fais progresser ton algorithme.
Tu prends une liste qui ne "marche pas" et tu y vas step by step...
tu regardes la valeur à chaque fois et tu la compares avec celle à laquelle tu t'attendais...

par ailleurs on ne peut pas t'aider si tu ne poses pas une question précise (comment reproduire, où se trouve l'erreur, etc)
la vie est une fête :)

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 18 Nov 2016, 11:23

Si je rentre par exemple [36,12,10,8,54,12] il me la considère comme une chaîne de caractères.
Comment dire à python que notre entrée est une liste de floats ?

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21512
Enregistré le: 11 Nov 2009, 22:53

Re: PYTHON : liste décroissante

par Ben314 » 18 Nov 2016, 13:01

Je sais pas comment tu t'es débrouillé vu que moi il me prend bien le truc comme étant une liste :Image
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 18 Nov 2016, 13:29

Alors ça c'est bizarre ... https://drive.google.com/file/d/0Bx2AEal0fcSyOG82Y1FRSTBMM3c/view?usp=sharing

Ça me rend fou l'informatique, vive la chimie et les maths pures !
(Je ne sais pas comment on insert une image directement)

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21512
Enregistré le: 11 Nov 2009, 22:53

Re: PYTHON : liste décroissante

par Ben314 » 18 Nov 2016, 14:22

En cherchant bien la seule différence que je vois, c'est que sur mon truc, c'est, me semble t-il, du "Python 2.7" alors que le tien, c'est du "Python 3.3".
Et je sais qu'il y a eu de grosse modifications entre les deux versions, en particulier en ce qui concerne la gestion des liste.
Sauf que je sait pas répondre pour autant concernant le "pourquoi" ça produit un tel résultat.
Je pourrait éventuellement aller gratter dans la doc de Python, mais ça risque d'être long (et c...) et comme je pense que, par exemple, fatal_error connait le réponse...

Pour le moment, regarde ce que ça donne si tu remplace le l=input() par un l=[36,12,10,8,54,12] histoire de comprendre la suite du programme.

EDIT : début de réponse là :
http://python.developpez.com/cours/appr ... age=page_8
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: PYTHON : liste décroissante

par fatal_error » 18 Nov 2016, 14:35

Comment dire à python que notre entrée est une liste de floats ?

en convertissant ta chaine caractère en liste de floats.
Code: Tout sélectionner
l = '1 2 3 45'
l = map(float,str.split(' '))
la vie est une fête :)

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 18 Nov 2016, 17:12

fatal_error a écrit:
Comment dire à python que notre entrée est une liste de floats ?

en convertissant ta chaine caractère en liste de floats.
Code: Tout sélectionner
l = '1 2 3 45'
l = map(float,str.split(' '))


Merci mais map(float,str.split(' ')), ça ne marche pas

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 18 Nov 2016, 17:18

Ben314 a écrit:En cherchant bien la seule différence que je vois, c'est que sur mon truc, c'est, me semble t-il, du "Python 2.7" alors que le tien, c'est du "Python 3.3".
Et je sais qu'il y a eu de grosse modifications entre les deux versions, en particulier en ce qui concerne la gestion des liste.
Sauf que je sait pas répondre pour autant concernant le "pourquoi" ça produit un tel résultat.
Je pourrait éventuellement aller gratter dans la doc de Python, mais ça risque d'être long (et c...) et comme je pense que, par exemple, fatal_error connait le réponse...

Pour le moment, regarde ce que ça donne si tu remplace le l=input() par un l=[36,12,10,8,54,12] histoire de comprendre la suite du programme.

EDIT : début de réponse là :
http://python.developpez.com/cours/appr ... age=page_8


Merci. En regardant ce que ça donne si je remplace le l=input() par un l=[36,12,10,8,54,12], le programme fonctionne bien correctement ! donc je ne vois toujours pas où est le problème .
Je pense qu'il faudrait convertir l'entrée en liste mais la fonction que m'a donné fatal_error ne marche pas.

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21512
Enregistré le: 11 Nov 2009, 22:53

Re: PYTHON : liste décroissante

par Ben314 » 18 Nov 2016, 17:57

C'est juste une faute de frappe de fatal.
Essaye ça :
Code: Tout sélectionner
l = map(float,str.split( l ))
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

nico10310
Membre Naturel
Messages: 45
Enregistré le: 30 Oct 2016, 12:21

Re: PYTHON : liste décroissante

par nico10310 » 18 Nov 2016, 18:20


Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: PYTHON : liste décroissante

par fatal_error » 18 Nov 2016, 19:08

faut essayer de comprendre ce que tu fais nico10310...
j'ai l'impression qu'on te dirait format C:/ que tu irais droit dedans lol

l = map(float,str.split(' '))

d'apres toi que vaut str??
tu prends ta chaine '1 2 3'
tu la splittes: '1 2 3'.split(' ') ce qui te donne ['1', '2', '3']
tu mappes tes nombres en float: map(float, ['1', '2', '3']) ce qui te donne [1,2,3]
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite