Choix, échantillon et choix pour sélectionner au hasard des éléments d’une liste en Python.

Affaires

Les fonctions choice(), sample() et choices() du module random de la bibliothèque standard Python peuvent être utilisées pour sélectionner et extraire de manière aléatoire des éléments d'une liste, d'un tuple, d'une chaîne ou d'un autre objet séquentiel (échantillonnage aléatoire).

choice() obtient un seul élément, sample() et choices() obtiennent une liste d'éléments multiples. sample() est une extraction non récupérable sans doublons, choices() est une extraction récupérable avec doublons.

Les informations suivantes sont fournies ici.

  • Sélectionnez un élément au hasard.: random.choice()
  • Sélection aléatoire de plusieurs éléments (pas de doublons): random.sample()
  • Sélectionner aléatoirement plusieurs éléments (avec des doublons): random.choices()
  • Fixer la graine du nombre aléatoire

Sélectionnez un élément au hasard.: random.choice()

Avec la fonction choose() du module random, un élément est choisi au hasard dans la liste et peut être récupéré.

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

Il en va de même pour les tuples et les chaînes de caractères. Dans le cas des chaînes de caractères, un seul caractère est sélectionné.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

Erreur si une liste, un tuple ou une chaîne vide est spécifiée comme argument.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

Sélection aléatoire de plusieurs éléments (pas de doublons): random.sample()

Avec la fonction sample() du module random, vous pouvez obtenir plusieurs éléments au hasard dans une liste. Il n'y a pas de duplication d'éléments (extraction non récupérable).

Le premier argument est une liste, et le second argument est le nombre d'éléments à récupérer. La liste est retournée.

import random

l = [0, 1, 2, 3, 4]

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

Si le deuxième argument vaut 1, une liste avec un élément est également renvoyée ; s'il vaut 0, la liste est vide. Si le deuxième argument vaut 1, une liste comportant un élément est renvoyée ; s'il vaut 0, une liste vide est renvoyée. Si le premier argument est supérieur au nombre d'éléments de la liste, une erreur se produit.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

Si le premier argument est un tuple ou une chaîne, ce qui est retourné est toujours une liste.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

Si vous voulez retourner à un tuple ou à une chaîne de caractères, utilisez tuple(),join().

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

Notez que la valeur n'est pas jugée, donc si la liste ou le tuple original contient des éléments avec la même valeur, il y a une possibilité que la même valeur soit sélectionnée.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

print(random.sample(l_dup, 3))
# [3, 1, 1]

Si vous voulez éviter les valeurs en double, vous pouvez utiliser set() pour le convertir en un ensemble (type set) et n'extraire que les éléments uniques, puis utiliser sample().

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

Sélectionner aléatoirement plusieurs éléments (avec des doublons): random.choices()

La fonction choices() du module random permet de récupérer plusieurs éléments au hasard dans une liste et, contrairement à sample(), elle permet de sélectionner des éléments en double.

choices() est une fonction ajoutée dans Python 3.6. Elle n'est pas disponible dans les versions antérieures.

L'argument k spécifie le nombre d'éléments à récupérer. La duplication est autorisée, donc le nombre d'éléments à récupérer peut être plus grand que le nombre d'éléments dans la liste originale.

Puisque k est un argument à mot-clé seulement, il est nécessaire de spécifier un mot-clé, tel que k=3.

import random

l = [0, 1, 2, 3, 4]

print(random.choices(l, k=3))
# [2, 1, 0]

print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]

La valeur par défaut de k est 1 ; si elle est omise, une liste avec 1 élément est retournée.

print(random.choices(l))
# [1]

L'argument poids peut être utilisé pour spécifier le poids (probabilité) que chaque élément sera sélectionné, et le type des éléments de la liste peut être int ou float.

print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]

print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]

L'argument cum_weights peut également être spécifié comme un poids cumulatif. Le cumul des poids dans l'exemple de code suivant est équivalent aux premiers poids ci-dessus.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

La valeur par défaut des arguments weights et cum_weights est None, ce qui signifie que chaque élément est sélectionné avec la même probabilité.

Si la longueur (nombre d'éléments) de l'argument weights ou cum_weights est différente de la liste originale, une erreur se produit.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

C'est également une erreur de spécifier les poids et les poids cumulés en même temps.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights

Nous avons spécifié une liste comme premier argument à titre d'exemple dans l'exemple de code jusqu'à présent, mais la même chose s'applique aux tuples et aux chaînes de caractères.

Fixer la graine du nombre aléatoire

En donnant un nombre entier arbitraire à la fonction seed() du module random, la graine de nombre aléatoire peut être fixée et le générateur de nombre aléatoire peut être initialisé.

Après initialisation avec la même graine, les éléments sont toujours sélectionnés de la même manière.

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3
Copied title and URL