Problème de programme de tri

Résolu/Fermé
Desooe - Modifié le 11 oct. 2022 à 16:03
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

Bonjour,

J'ai fait un programme de tri dans une liste et je ne trouve pas le problème dedans.

Le programme :

def ranger_croissant(lst):
    r = []
    mini = 1000000
    x = 0
    for i in range(len(lst)):
        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))

Pourriez-vous m'aider ?

Cordialement

A voir également:

2 réponses

mamiemando Messages postés 33414 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 décembre 2024 7 808
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
 

2

Merci beaucoup pour cette réponse complète et les conseils, ça m'a bien aidé.

Cordialement

0
mamiemando Messages postés 33414 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 décembre 2024 7 808
20 oct. 2022 à 09:27

Merci pour ton retour positif, bonne continuation ;-)

0