Python, tri par ordre croissant d'une liste

Le problème exposé dans ce sujet a été résolu.

Bonjour, j'ai commencé le python il y a pas longtemps, et je travaille sur un petit exercice que l'on m'a donné. Je dois à partir d'une liste, trier les valeurs qui s'y trouve par ordre croissant. Seulement, c'est pas aussi simple que je le pensais ^^ J'aurais pu chercher sur Google, mais je préfère le faire moi même. Pour l'instant, voila ce que j'ai sorti comme code :

La première partie sert a récupérer la valeur la plus petite de la liste, afin de commencer par le min. Cette partie la est fonctionnelle. En revanche, c'est dans les boucles que ca merdouille. En principe, je parcours le tableau avec 2 boucles, l'une qui compare les valeurs à i et i+1, et je remplace la case au début du tableau dès que je trouve la plus petite valeur. La seconde boucle incrémente de 1 a chaque fois que l'autre boucle a finie pour ne retravailler que sur les nombres non classés.

Il me manque qlq chose mais j'arrive pas à trouver quoi … merci d'avance pour votre aide ^^

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
val=[5,2,4,3]
u=1
i=0
min=val[0]
minpos=0
if val[i]<min:
        min=val[i]
        minpos=i
        tamp=val[0]
        val[0]=val[i]
        val[i]=tamp
while i<len(val):
    while u<(3):
        if val[i]>val[u]:
            tamp2=val[u]
            val[u]=val[i]
            val[i]=tamp2
            print(val)
        u=u+1
    i=i+1

print(val)

edit: quand j'F5 ça, le terminal m'affiche : [2, 5, 3, 4] [2, 5, 3, 4]

Je crois que j'ai compris le code, et je vois deux-trois problèmes:

le code

1
2
3
4
5
6
if val[i]<min:
        min=val[i]
        minpos=i
        tamp=val[0]
        val[0]=val[i]
        val[i]=tamp

est inutile : i=0 et min=val[0] donc forcement val[i]=min. Au passage, min est un mot-clé du langage, donc il vaut mieux éviter de la prendre comme nom de variable.

Ensuite, pourquoi while u<(3): ? u<len(val) ne serait pas mieux ?

Pour finir, une fois ta boucle sur u terminée, u vaut 3, donc la boucle n'est plus jamais évaluée ! ^^ Il faut rajouter un truc du genre u=i+1 juste au dessus de i=i+1 (après la boucle sur u).

En faisant ça, chez moi, ça marche.

Aussi, en python, on peut faire :

1
2
3
4
a = 1
b = 2
a,b = b,a
print(a,b) #renvoie 2, 1

pas besoin de créer la variable intermédiaire à la main.

+1 -0

Je crois que j'ai compris le code, et je vois deux-trois problèmes:

le code

1
2
3
4
5
6
if val[i]<min:
        min=val[i]
        minpos=i
        tamp=val[0]
        val[0]=val[i]
        val[i]=tamp

est inutile : i=0 et min=val[0] donc forcement val[i]=min. Au passage, min est un mot-clé du langage, donc il vaut mieux éviter de la prendre comme nom de variable.

Ah, je savais pas, merci !

Ensuite, pourquoi while u<(3): ? u<len(val) ne serait pas mieux ?

Tu as raison, en plus j'avais mis ça au début et puis je sais plus pourquoi je l'ai enlevé

Pour finir, une fois ta boucle sur u terminée, u vaut 3, donc la boucle n'est plus jamais évaluée ! ^^ Il faut rajouter un truc du genre u=i+1 juste au dessus de i=i+1 (après la boucle sur u).

je vais regardez ça ^^

En faisant ça, chez moi, ça marche.

Aussi, en python, on peut faire :

1
2
3
4
a = 1
b = 2
a,b = b,a
print(a,b) #renvoie 2, 1

pas besoin de créer la variable intermédiaire à la main.

Gabbro

Pinaise je savais que je l'avais vu mais je me souvenais plus de la syntaxe, fort pratique ça !

Merci pour la réponse rapide :)

Je pense que c'est globalement un mauvais exercice. C'est l'un des avantages de python d'être livré avec une bonne lib standard. Un dev python n'ecrira jamais ce genre de code totalement inefficace, il fera simplement :

1
val.sort()

Ou si on ne veut pas modifier la liste d'origine :

1
new_val = sorted(val)

Je peut comprendre l'intérêt algorithmique de ce genre d'exo mais ça ne donne pas les bonnes habitudes python.

Pour finir, une fois ta boucle sur u terminée, u vaut 3, donc la boucle n'est plus jamais évaluée ! ^^ Il faut rajouter un truc du genre u=i+1 juste au dessus de i=i+1 (après la boucle sur u).

En faisant ça, chez moi, ça marche.

Gabbro

J'ai fait ça, ça marche ^^ mais .... je comprends pas pourquoi on rajoute un u=i+1

C'est bon j'ai compris ! C'est effectivement le u=i+1 qui me manquait pour pouvoir me décaler dans la liste au fur et a mesure ! Merci pour l'aide en tout cas !

Je pense que c'est globalement un mauvais exercice. C'est l'un des avantages de python d'être livré avec une bonne lib standard. Un dev python n'ecrira jamais ce genre de code totalement inefficace, il fera simplement :

1
val.sort()

Ou si on ne veut pas modifier la liste d'origine :

1
new_val = sorted(val)

Je peut comprendre l'intérêt algorithmique de ce genre d'exo mais ça ne donne pas les bonnes habitudes python.

Kje

En fait c'est un bout de code que je vais utiliser dans mon projet tut, mais à la place de 4 entiers j'en aurait .. beaucoup plus. Une fois triés, ca me permettra d'afficher une courbe et de faire joujou avec les données ^^

je pourrais utiliser une librairie, mais ca serait pas forcement bien vu ;)

Ce ne serait pas forcément bien vu de montrer que tu connais la lib standard de python ? Je trouve ça étrange.

En plus, il est probable que le code derrière val.sort() soit bien plus efficace que le tien car codé par des professionnels de l'algorithmique, qui ont optimisé tout ce qu'ils pouvaient (ce n'est pas pour être méchant que je dis ça).

+0 -0

Ce ne serait pas forcément bien vu de montrer que tu connais la lib standard de python ? Je trouve ça étrange.

J'en ai pas vraiment parler avec mes tuteurs, mais je suppose, c'est un projet tut de prog, en soit pas vraiment compliqué on va dire donc …

En plus, il est probable que le code derrière val.sort() soit bien plus efficace que le tien car codé par des professionnels de l'algorithmique, qui ont optimisé tout ce qu'ils pouvaient (ce n'est pas pour être méchant que je dis ça).

poliorcetics

Surement oui :D

Comme tu veux mais la methode sort c'est même pas une lib, c'est une methode de la lib standard. Bien utiliser python c'est bien utiliser les possibilités qu'il offre. Je trouve ça un peu dommage de perdre du temps sur un tri qui est fournit en beaucoup plus efficace de base par le langage.

Tu devrais en parler à ton prof. C'est fournit par le langage, pourquoi ne pas l'utiliser ? Ça te permetrait de gagner plus de temps et de te concentrer sur l'inteprétation des données.

NB: Qui dit long tableau de nombre en python dit généralement numpy. Il y a dans numpy une fonction de tri probablement encore plus efficace.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte