Skip to content

Échantillonnage aléatoire à partir d’une liste en Python (random.choice, sample, choices)

En Python, vous pouvez échantillonner au hasard des éléments d’une liste avec choice(), sample() et choice() du module random. Ces fonctions peuvent également être appliquées à une chaîne et à un tuple.

choice() renvoie un élément aléatoire, et sample() et choice() renvoient une liste de plusieurs éléments aléatoires. sample() est utilisé pour un échantillonnage aléatoire sans remplacement, et choice() est utilisé pour un échantillonnage aléatoire avec remplacement.

Cet article décrit le contenu suivant.

  • Choisissez un élément au hasard :random.choice()
  • Échantillon aléatoire sans remplacement :random.sample()
  • Échantillon aléatoire avec remplacement :random.choices()
  • Initialisez le générateur de nombres aléatoires :random.seed()

Si vous souhaitez sélectionner des éléments dans une liste par conditions, consultez l’article suivant.

Si vous souhaitez mélanger la liste entière ou obtenir une liste de nombres aléatoires, consultez l’article suivant.

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

random.choice() renvoie un élément aléatoire d’une liste.

import random

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

print(random.choice(l))
# 1

Les tuples et les chaînes sont traités de la même manière. Dans le cas d’une chaîne, un caractère est renvoyé.

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

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

Une erreur est générée si une liste, un tuple ou une chaîne est vide.

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

Échantillon aléatoire sans remplacement :random.sample()

random.sample() échantillonne au hasard plusieurs éléments d’une liste sans remplacement.

Passez une liste au premier argument et le nombre d’éléments que vous souhaitez obtenir au deuxième argument. Une liste est renvoyée.

import random

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

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

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

Si le deuxième argument est défini sur 1, une liste avec un élément est renvoyée. Si défini sur 0, une liste vide est renvoyée. S’il est défini sur la valeur qui dépasse le nombre d’éléments de la liste, une erreur est générée.

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

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

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

Même si vous passez un tuple ou une chaîne au premier argument, la liste est renvoyée.

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

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

Pour convertir une liste en un tuple ou une chaîne, utilisez tuple(), join().

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

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

Notez que si la liste ou le tuple d’origine contient des éléments en double, la même valeur peut être 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 souhaitez éviter les valeurs en double, utilisez set() pour convertir les listes et les tuples en set, extrayez uniquement les éléments uniques, puis utilisez sample().

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

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

Échantillon aléatoire avec remplacement :random.choices()

random.choices() échantillonne au hasard plusieurs éléments d’une liste avec remplacement.

random.choices() a été ajouté dans Python 3.6 et ne peut pas être utilisé dans les versions antérieures.

Spécifiez le nombre d’éléments que vous voulez obtenir avec l’argument k. Étant donné que les éléments sont choisis avec remplacement, k peut être supérieur au nombre d’éléments de la liste d’origine.

Étant donné que k est un argument composé uniquement de mots-clés, il est nécessaire de spécifier comme 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]

k est défini sur 1 par défaut. S’il est omis, une liste avec un élément est renvoyée.

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

Vous pouvez spécifier le poids (probabilité) de chaque élément à l’argument poids. Le type de l’élément de liste spécifié dans weights peut être int ou float. S’il est défini sur 0, l’élément n’est pas sélectionné.

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]

Les poids cumulés peuvent être spécifiés dans l’argument cum_weights. cum_weights dans l’exemple de code suivant est équivalent aux premiers poids dans le code ci-dessus.

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

Par défaut, weights et cum_weights sont définis sur None, et chaque élément est sélectionné avec la même probabilité.

Si la longueur (nombre d’éléments) de weights ou cum_weights est différente de la liste d’origine, une erreur est générée.

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

De plus, une erreur est générée si vous spécifiez des poids et cum_weights 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

Jusqu’à présent, dans l’exemple de code, une liste a été spécifiée pour le premier argument, mais il en va de même pour un tuple et une chaîne.

Initialisez le générateur de nombres aléatoires :random.seed()

Vous pouvez initialiser un générateur de nombres aléatoires avec random.seed().

Après initialisation avec la même graine, l’élément est sélectionné de la même manière.

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

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