Bonjour,
existe-t-il un moyen élégant de mélanger les entrées d'un tableau ?
Par exemple, j'entre ['un', 'deux', 'trois', 'quatre'] et j'obtiens quelque chose comme ['trois', 'deux', 'un', 'quatre'].
Version imprimable
Bonjour,
existe-t-il un moyen élégant de mélanger les entrées d'un tableau ?
Par exemple, j'entre ['un', 'deux', 'trois', 'quatre'] et j'obtiens quelque chose comme ['trois', 'deux', 'un', 'quatre'].
Il s'agit sans doute de listes. Il existe bien un objet array en Python, mais il ne peut stocker de chaînes de caratères.
Pour le mélange de la liste en place, c'est pratiquement dans la FAQ:Si vous ne voulez pas détruire la liste originale, vous pouvez y acceder une table d'entiers "shufflés":Code:
1
2
3
4
5
6
7
8 import random random.seed() liste = ['un', 'deux', 'trois', 'quatre'] print liste random.shuffle(liste) print liste
Il y a peut-être plus élégant, regardez le module random dans le manuel, je n'en connais pas toutes les subtilités...Code:
1
2
3
4
5
6
7
8
9
10 import random random.seed() liste = ['un', 'deux', 'trois', 'quatre'] table = range(len(liste)) print liste random.shuffle(table) print [liste[table[_]] for _ in range(len(liste))]
Bonjour,
Il y a dans le module random une fonction shuffle() qui fait ça:
TyrtamosCode:
1
2
3
4
5
6
7 import random L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] random.shuffle(L) print L [4, 9, 3, 5, 0, 1, 7, 2, 6, 8]
[grillé par Pierre Maurette :D]
Edit: complément: si on veut pas toucher à la liste, on peut utiliser une autre liste comme index, dont les valeurs d'index sont mélangées. Par exemple:
Code:
1
2
3 IND = random.sample(xrange(0,10),10) [4, 6, 2, 8, 3, 0, 7, 5, 1, 9]
Salut,
En utilisant un générateur de nombres aléatoires dans les limites du nombre de variables contenues dans ton tableau.
dans une boucle :
- récupérer le nombre aléatoire généré en fonction de la taille de ta liste :
Par exemple, tu as 4 variables :
randint( a, b)
Retourne un entier aléatoire N de telle manière que a <= N <= b.
pour toi : randint (0,len(MaListe))
- Tu as crée une liste dans laquelle tu vas placer chaque nombre aléatoire généré SI, et seulement SI, ce nombre n'y est déjà pas.
- Si tu as pu introduire le nombre aléatoire dans la liste, c'est qu'il n'a pas encore été tiré :mouarf: et que tu n'as pas encore traité l'entrée correspondante de ta liste de valeurs :mouarf:.
Tu vas donc pouvoir sélectionner l'entrée de ta liste de valeur à l'indice donné par le nombre aléatoire tiré et placer cette valeur dans la nouvelle liste triée :) .
- Tu continues tant que tu n'as pas utilisé toutes les valeurs contenues dans la liste des valeurs - 1 puisque la dernière valeur n'a pas besoin d'être choisie aléatoirement puisqu'il ne reste qu'elle. (ça raccourcis la durée du programme !).
- Par précaution, met une limite maxi au bouclage car si, en cas de malheur, tu ne parvenais pas à pouvoir sélectionner toutes les valeurs de ta liste de valeurs, il serait malvenu que ton programme monopolise ta machine indéfiniment :aie: . (Tu mets le nombre de boucles à len(MaListe)*10000 par exemple.
:aie:Mais si tu as terminé le traitement de ta liste avant cette limite, tu dois forcer ton programme à sortir de la boucle :aie: .
Voilà une marche à suivre.
8OPour le code, c'est à toi de l'écrire. C'est comme ça qu'on apprend.8O
Présente ton code en cas de problème.
A+
Merci à tous. :D
Les deux premiers messages proposent une méthode élégante comme je cherchais. :king:
Sinon merci pour la 3ème méthode (même si je savais déjà faire ce genre de chose).
PS : promis Pierre Maurette, je m'attarderais un peu sur la FAQ à l'occasion. :oops:
" je m'attarderais un peu sur la FAQ à l'occasion "
Ce conditionnel ne donne pas l'impression d'une grande motivation.............
Ne le dis surtout pas à mes parents... :lol:
Bonjour!
Je cherche à mélanger au hasard une liste d'images, par exemple:
images = (PhotoImage(file='photo1.gif'), PhotoImage(file='photo2.gif'), PhotoImage(file='photo3.gif') )
j'ai essayé:
import random
images2 = random.shuffle(images)
mais ça ne fonctionne pas...
sinon, j'ai aussi tenté de créer la fonction de permutation de liste suivante et de rappeler ensuite la fonction pour l'appliquer à la liste images, mais ça n'a pas marché non plus...
def listperm(lst):
n = len(lst)
for p in range (n):
q = randrange(n)
lst[p], lst[q] = lst[q], lst[p]
return lst
Quelques petits conseils seraient les bien venus...
Merci d'avance!
Bonjour,
Ta variable images est un tuple et ne peut pas être modifié. Pour cela, il faut utiliser une liste (avec des crochets et pas des parenthèses).
De plus, random.shuffle modifie "sur place" et ne renvoie rien.
Il faut donc faire comme suit:
Ce qui affiche par exemple (et si la fonction PhotoImage se contente de renvoyer son argument):Code:
1
2
3
4
5
6 images = [PhotoImage(file='photo1.gif'), PhotoImage(file='photo2.gif'), PhotoImage(file='photo3.gif') ] print images random.shuffle(images) print images
TyrtamosCode:
1
2
3 ['photo1.gif', 'photo2.gif', 'photo3.gif'] ['photo2.gif', 'photo3.gif', 'photo1.gif']
Pour répondre à la question initiale de rambc, on peut aussi faire
Résultat obtenu:Code:
1
2 li = ['un','deux','trois','quatre','cinq','six','sept','huit'] print list(set(li))
Citation:
['trois', 'sept', 'six', 'un', 'deux', 'huit', 'quatre', 'cinq']
Mais ce n'est pas réellement un résultat aléatoire Si on refait plusieurs fois la même instruction on obtient toujours le même résultat:
RésultatCode:
1
2
3
4
5
6 li = ['un','deux','trois','quatre','cinq','six','sept','huit'] print list(set(li)) print list(set(li)) print list(set(li)) print list(set(li)) print list(set(li))
Citation:
['trois', 'sept', 'six', 'un', 'deux', 'huit', 'quatre', 'cinq']
['trois', 'sept', 'six', 'un', 'deux', 'huit', 'quatre', 'cinq']
['trois', 'sept', 'six', 'un', 'deux', 'huit', 'quatre', 'cinq']
['trois', 'sept', 'six', 'un', 'deux', 'huit', 'quatre', 'cinq']
['trois', 'sept', 'six', 'un', 'deux', 'huit', 'quatre', 'cinq']
Mais on peut doubler le procédé:
Le résultat est différentCode:
1
2 li = ['un','deux','trois','quatre','cinq','six','sept','huit'] print list(set(list(set(li))))
Mais il reste fixeCitation:
['trois', 'quatre', 'six', 'un', 'deux', 'huit', 'sept', 'cinq']
Cependant ce procédé est peut être suffisant pour les besoins.
Merci beaucoup!!!
C'a m'a beaucoup aidé!! :D