Python, les listes, le hasard
Aujourd’hui, on fait du pseudo-aléatoire. Python est un langage de script très pratique lorsqu’on doit manipuler des listes (tableaux), ou des dictionnaires (tables de hachage). Voyons comment en très peu de code, on peut lier les listes avec le module random
.
Imaginons que je veuille choisir un ou plusieurs éléments au hasard dans une liste d’éléments. Je connais quelques bases du module random
, je vais donc avoir envie de procéder comme suit :
import random ma_liste = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # Obtenir un élément au hasard i = random.randint(0, len(ma_liste) - 1) elem = ma_liste[i] # Obtenir un ensemble d'élements au hasard nb_elem = 6 indices = [] while nb_elem > 0: i = random.randint(0, len(ma_liste) -1) while i in indices: # tant que le tirage redonne un nombre déjà choisi i = random.randint(0, len(ma_liste) -1) indices.append(i) nb_elem = nb_elem - 1 resultat = [] for index in indices: resultat.append(ma_liste[index])
Pas très élégant, n’est ce pas? Heureusement, random
nous offre aussi des fonctions sur les listes. Ça devrait donc plutôt donner ça :
import random ma_liste = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # Obtenir un élément au hasard un_element = random.choice(ma_liste) # Obtenir échantillon de 6 éléments echantillon = random.sample(ma_liste, 6)
Beaucoup mieux!
En bonus, si vous souhaitez mélanger les éléments d’une liste, pour la parcourir dans un ordre différent (et aléatoire) de l’ordre de sa construction, procédez ainsi :
import random ma_liste = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] random.shuffle(ma_liste) # Attention, la liste sera modifiée "sur place"
Source : la documentation officielle de python concernant le module random
.
Voilà, la force de Python: pouvoir faire des choses élégantes en peu de lignes.
Avec Perl, on peut aussi faire peu de lignes mais c’est dégueulasse…
(on voit le troll contre Perl là ou pas ?)
Billet intéressant. J’avais débuté le Python au lycée (pour le fun :/) et n’ai jamais approfondi.
Me donne envie de recommencer !
Critidos> j’utilise parfois le python pour me faire des utilitaires « maison » pour mon workflow photographique. J’ai aussi un collègue qui a mis en place tout un système de génération de planches-contacts et de sauvegarde automatique tout codé en python. C’est vraiment un bel outil!
La problème c’est que ta liste contient une suite d’entier continue… Que faire si j’ai une liste du type [0,5,8,2,9,9]??
Pierre> Ça dépend de ce que tu veux faire par la suite. L’article se concentre sur l’échantillonnage pseudo-aléatoire sur une liste quelconque. Si tu souhaites dédoublonner, le plus simple est de passer par un « set » : ma_liste = list(set(ma_liste))