Problème de programme de tri
Résolu/Fermémamiemando Messages postés 33414 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 décembre 2024 - 20 oct. 2022 à 09:27
- Problème de programme de tri
- Programme demarrage windows 10 - Guide
- Tri excel - Guide
- Logiciel de tri de photos - Guide
- Désinstaller programme windows 10 - Guide
- Programme démarrage windows 10 - Guide
2 réponses
Modifié le 11 oct. 2022 à 16:23
Bonjour,
Concernant le message initial
J'ai remis en forme ton message, veille bien à suivre ce tutoriel quand tu partages du code.
Plusieurs remarques : soigne l'indentation (corrigée par mes soins dans ton message initiale) :
- les indentations doivent idéalement être un multiple de 4 espaces
- mets des espaces autour des opérateur, mais pas devant les ":"
- les variables (et les fonctions) ont normalement un nom qui commence en minuscule
Comprendre d'où vient l'erreur
La première chose à faire c'est d'exécuter le programme et de comprendre l'éventuel message d'erreur et le résultat obtenu. En l'occurrence, on obtient :
Traceback (most recent call last):
File "/home/mando/toto.py", line 18, in <module>
print(ranger_croissant(liste_4))
File "/home/mando/toto.py", line 13, in ranger_croissant
lst.remove(mini)
ValueError: list.remove(x): x not in list
On voit donc qu'au moment de faire lst.remove(mini), tu tentes de supprimer de lst une valeur mini qui n'y figure pas, donc mini ne vaut probablement pas ce que tu crois. Il faut donc regarder ce qu'elle vaut en insérant juste avant cette instruction un print(lst, mini) pour voir ce que valent ces variables.
On obtient alors ceci :
[12, 2, 58, 64, 35, -75, 31, -16] -75
[12, 2, 58, 64, 35, 31, -16] -75
Traceback (most recent call last):
File "/home/mando/toto.py", line 19, in <module>
print(ranger_croissant(liste_4))
File "/home/mando/toto.py", line 14, in ranger_croissant
lst.remove(mini)
ValueError: list.remove(x): x not in list
On voit donc que tu tentes de supprimer une valeur qui a déjà été supprimée. Et cela vient du fait que ta variable mini n'a pas été réinitialisée depuis le dernier tour de boucle.
Corriger l'erreur
Si on veut corriger le programme, plutôt qu'initialiser x à 1000000, on l'initialiserait à sys.maxsize en python3 (resp. sys.maxint en python2), et il faut ensuite le réinitialiser à chaque tour de boucle (entre les lignes 5 et 6).
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys def ranger_croissant(lst): r = [] x = 0 for i in range(len(lst)): mini = sys.maxsize for loop in range(len(lst)): x = lst[loop] if x < mini: mini = x lst.remove(mini) r.append(mini) return r liste_4 = [12, 2, 58, 64, 35, -75, 31, -16] print(ranger_croissant(liste_4))
Résultat :
[-75, -16, 2, 12, 31, 35, 58, 64]
Améliorer le programme
Avec min
Ton programme s'écrit beaucoup plus simplement si tu t'autorises l'utilisation de la fonction min, dont le but est comme son nom le suggère de trouver le minimum d'un itérable (par exemple, une liste). Cela t'éviterait d'avoir à initialiser la variable mini avec une valeur arbitraire (ici 1000000) qui fera que ton code ne marchera plus si la liste comporte une valeur supérieure.
Le programme devient alors :
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def ranger_croissant(lst): r = [] for i in range(len(lst)): mini = min(lst) lst.remove(mini) r.append(mini) return r liste_4 = [12, 2, 58, 64, 35, -75, 31, -16] print(ranger_croissant(liste_4))
Avec sorted
Ton programme s'écrit encore plus simplement (et plus efficacement) avec la fonction sorted (implémente le tri rapide qui s'exécute en O(n.log(n)), là où un tri correspond à un tri par insertion et s'exécute en O(n^2).
liste_4 = [12, 2, 58, 64, 35, -75, 31, -16] print(sorted(liste_4))
Bonne chance
Merci beaucoup pour cette réponse complète et les conseils, ça m'a bien aidé.
Cordialement
20 oct. 2022 à 09:27
Merci pour ton retour positif, bonne continuation ;-)