Bonjour, je débute le python depuis quelques temps et j'aimerais créer une petite fonction qui supprimerai les doublons d'une liste générer aléatoirement, quelqu'un pour m'aider ?
Version imprimable
Bonjour, je débute le python depuis quelques temps et j'aimerais créer une petite fonction qui supprimerai les doublons d'une liste générer aléatoirement, quelqu'un pour m'aider ?
Bonjour,
Utilise la méthode shuffle du module random et tu n'auras pas de doublons.
Désolé mais ça ne marche pas...Pièce jointe 583323
Excuse, je me suis planté dans ma recommandation ...
Sinon ,répond il à ton interrogation ?Code:list(set(rdm))
malheureusement non regarde...Pièce jointe 583325
Pourtant
Code:
1
2
3
4 l = [1,3,1,1,2,2] l = list(set(l)) print(l) [1, 2, 3]
Bonjour
En ligne 22 il te faut affecter la liste sinon elle est perdue !!! :roll:
De plus (question de réflexion) c'est plus rapide de trier une liste épurée que trier une liste puis ensuite l'épurer. Et (toujours dans la réflexion), que crois-tu que fera la boucle for i in range(len(maListe)) de la ligne 36 alors qu'en ligne 10 il est écrit maListe=[] ???
Et accessoirement, ici on poste les codes au lieu de montrer des images. Ca nous permet éventuellement de les recopier pour les tester.
Deux remarques qui ne sont pas en rapport direct avec ton problème de doublons et de tri.
Dans ta dernière capture d'écran, pourquoi initialiser la variable valeurMin (qu'il faut plutôt écrire valeur_min pour être conforme aux conventions de nommage PEP8) avec une si grande valeur ?
Tu connais la valeur la plus grande que tu risques d'avoir dans ta liste puisque c'est la balise supérieure passée à la méthode randint qui a généré les nombres aléatoires.
Il suffit de l'initialiser comme ceci
Vers la fin de ta capture, tu peux simplifier la boucle qui permet de récupérer les éléments de ta liste 'MaListe' (qui au passage est vide (ligne 10) voir remarque de Sve@r ci-dessus; et qu'il faut écrire ma_liste ... PEP8)Code:valeurMin = n-1
Tu utilises cette formulation pour pouvoir récupérer les indices des éléments dans la liste en même temps les éléments.
Il y a un autre moyen plus concis de le faire mais cela fait appel à une fonction sur des itérables que tu n'as peut-être pas encore vue, la fonction enumerate.
Code:
1
2
3
4
5
6
7
8
9
10 # pour chaque index et élément de la liste for i, element in enumerate(ma_liste): # Si cout à l'indice i est plus petit que valeur_min if element < valeur_min: # Sauvegarde de cout dans valeur_min valeur_min = element # Sauvegarder l'indice i dans indice_valeur_min indice_valeur_min = i ...
Je pense que c'est le (0, n-1) qui t'a trompé. Tu as assimilé ça à la borne max du range. Je dis ça parce que moi aussi, quand j'ai lu ton commentaire, j'ai fait la même erreur et ai pensé "oui, s'il va jusqu'à n-1 exclu cela fait bien n-1 valeurs". C'est après que j'ai de nouveau regardé et compris "non, n-1 c'est la borne du randint, le range lui il va jusqu'à n".
C'est dommage parce que ce commentaire était en fait un des seuls trucs qui tient la route dans ce code et toi tu viens et tu le bâches là dessus :mouarf:
Ceci dit, il mérite. Il arrive avec son pseudo de looser (parce que "jesaispasmec" ça sent franchement pas le type qui en veut et qui va se battre pour savoir), nous met des copies d'écran même pas complètes et se contente de dire "ça marche pas" sans même faire l'effort de réfléchir un minimum sur le pourquoi du comment donc je ne vais pas le plaindre.
Merci pour toutes ses aides précieuses mais il me reste une chose à faire, dans le code ci-dessous je dois utiliser une méthode de tri par fusion avec une notion de récursivité mais je n'ai aucune idée de comment faire, une idée ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 import time import random # ici "n" sera la longueur de notre liste aléatoire n = input("Entrez valeurs:") # "l" déterminera si on tri les valeurs dans l'ordre croissant ou décroissant l = input("Entrez 1 ou 2 (soit 1 ordre croissant et 2 ordre décroissant): ") n = int(n) l = int(l) ma_liste = [] #générer une liste n entiers aléatoires compris entre 0 et n-1 rdm = [random.randint(0, n-1) for i in range(n)] #trier la liste elle même par ordre croissant avec la méthode de tri par fusion avec la notion de récursivité # supprimer ou non les doublons #début du timer debut = time.time() # initialiser variable indiceValeurMin à -1 indice_valeur_min = -1 # initialiser variable valeurMin avec un nombre très grand valeur_min = 10000000 # pour chaque index et élément de la liste for i, element in enumerate(ma_liste): # Si cout à l'indice i est plus petit que valeur_min if element < valeur_min: # Sauvegarde de cout dans valeur_min valeur_min = element # Sauvegarder l'indice i dans indice_valeur_min indice_valeur_min = i # Si indiceValeurMin est différent de -1 if indice_valeur_min != -1: #Afficher indiceValeurMin et valeurMin print(indice_valeur_min, ":", valeur_min) #fin du timer fin = time.time() print(rdm, (fin - debut))
Par respect pour les personnes qui t'aident, mets tes extraits de code entre les balises CODE pour une bonne lisibilité.
En haut de l'éditeur tu as un bouton #, ça va automatiquement insérer les balises à l'endroit où est ton curseur.
Pièce jointe 583374
Et ça apparaitra comme ceci :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 import time import random # ici "n" sera la longueur de notre liste aléatoire n = input("Entrez valeurs:") # "l" déterminera si on tri les valeurs dans l'ordre croissant ou décroissant l = input("Entrez 1 ou 2 (soit 1 ordre croissant et 2 ordre décroissant): ") n = int(n) l = int(l)
Salut,
Si vous n'avez pas d'idée vous pouvez toujours demander à votre moteur de recherché préféré ce qu'il trouve. Wikipédia a un excellent article sur ce sujet.
- W
Euh ouais, j'ai l'idée que t'es pas sorti du sable.
Déjà, une petite précision suite à ta remarque tendancieuse, on s'y connait tous vraiment. On est tous capables de coder un tri-fusion en récursif (d'autant plus que l'article de Wikipedia donné par wiztricks va même jusqu'à donner différents exemples d'algorithme et qu'il ne reste qu'à les traduire en Python) et ce n'est pas en nous lançant des banderilles de maternelle style "t'es même pas cap d'écrire un code tri-fusion en Python" qu'on te l'écrira. Ce n'est pas notre but, et ce n'est pas non plus censé être ton but. Et ça fait aussi parties des règles officielles de ce forum (chapitre IV). Bref pour résumer, on se connait tous entre nous de par nos multiples posts Python qu'on écrit et que les autres lisent et l'opinion que peut avoir de nous un brimborion comme toi ne nous atteint pas. Si tu veux un code tout fait, attend le corrigé que te donnera ton prof. Accessoirement tu ne feras croire à personne qu'un prof puisse donner un truc aussi évolué qu'un tri-fusion à un débutant qui ne serait même pas au niveau d'avoir vu la notion de récursivité en cours. Soit t'as eu le cours et tu es censé avoir le niveau, soit tu ne l'as pas eu et tu veux apprendre par toi-même (louable) mais dans ce cas, il faut commencer plus modestement (la factorielle par exemple).
Donc si tu connais la récursivité, faire un tri-fusion de (par exemple) 10 éléments, c'est alors commencer par faire un tri-fusion des 5 éléments de gauche, puis faire un tri-fusion des 5 éléments de droite. Une fois que chaque "sous-tableau" est lui-même trié, il suffit de les fusionner ensembles. C'est probablement l'algorithme de fusion qui est le plus difficile mais pas vraiment compliqué si tu l'assimiles à un appareillage. C'est à dire que tu places un indice pour chaque tableau puis tu compares les éléments de chaque tableau à leurs indices, et tu ne fais évoluer que l'indice lié au tableau contenant le plus petit des deux. Ainsi tu ne lis que les éléments d'un tableau tant qu'ils sont plus petit que l'autre et les indices ne montant que quand c'est nécessaire. Reste juste à gérer le cas où un indice a atteint le bout mais ça reste faisable.
Exemple de fusion entre deux tableaux triés
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #!/usr/bin/env python3 # coding: utf-8 import random TA=tuple(sorted(random.randint(0, 100) for i in range(10))) TB=tuple(sorted(random.randint(0, 100) for i in range(10))) print(TA) print(TB) ia=0 ib=0 TC=list() while ia < len(TA) or ib < len(TB): if ib == len(TB): TC.append(TA[ia]) ia+=1 continue # if if ia == len(TA): TC.append(TB[ib]) ib+=1 continue # if if TA[ia] <= TB[ib]: TC.append(TA[ia]) ia+=1 else: TC.append(TB[ib]) ib+=1 # if # while print(TC)
Et pour trier 5 éléments (ie les 5 éléments de gauche) cela peut se faire en triant les 3 premiers de gauches d'un côté, et les 2 de droite de l'autre. Et etc etc jusqu'à ce qu'il n'y ait plus qu'un seul élément à trier.
PS: accessoirement, ton besoin a changé depuis le début où il n'était question que de supprimer des doublons et ça non plus on n'aime pas (enfin moi je n'aime pas). Ca fait celui qui demande un doigt, on donne le doigt alors il demande un bras.