Question Comment sélectionner aléatoirement un élément d'une liste?


Supposons que j'ai la liste suivante:

foo = ['a', 'b', 'c', 'd', 'e']

Quel est le moyen le plus simple de récupérer un élément au hasard dans cette liste?


1298
2017-11-20 18:42


origine


Réponses:


Utilisation random.choice:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

Pour des choix aléatoires cryptographiquement sécurisés (par exemple pour générer une phrase secrète à partir d'une liste de mots), utilisez random.SystemRandom classe:

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

2129
2017-11-20 18:46



Au cas où vous auriez également besoin de l'index:

foo = ['a', 'b', 'c', 'd', 'e']
from random import randrange
random_index = randrange(0,len(foo))
print foo[random_index]

125
2017-09-11 15:31



Si vous voulez sélectionner au hasard plus d'un élément d'une liste, ou sélectionner un élément d'un ensemble, je vous recommande d'utiliser random.sample au lieu.

import random
group_of_items = {1, 2, 3, 4}               # a sequence or set will work here.
num_to_select = 2                           # set the number to select here.
list_of_random_items = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1] 

Si vous ne faites que tirer un seul élément d'une liste, le choix est moins lourd, car l'utilisation de l'échantillon aurait la syntaxe random.sample(some_list, 1)[0] au lieu de random.choice(some_list).

Malheureusement, le choix ne fonctionne que pour une seule sortie de séquences (telles que des listes ou des tuples). Bien que random.choice(tuple(some_set)) peut être une option pour obtenir un seul objet d'un ensemble.


107
2018-05-27 17:07



Je propose un script pour supprimer des éléments pris au hasard d'une liste jusqu'à ce qu'il soit vide:

Maintenir un set et retirer l'élément pris au hasard (avec choice) jusqu'à ce que la liste soit vide.

s=set(range(1,6))
import random

while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Trois courses donnent trois réponses différentes:

>>> 
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>> 
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])

>>> 
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])

27
2018-05-13 02:47



A partir de Python 3.6, vous pouvez utiliser le secrets module, qui est préférable à la random module pour la cryptographie ou les utilisations de sécurité.

Pour imprimer un élément aléatoire à partir d'une liste:

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))

Pour imprimer un index aléatoire:

print(secrets.randbelow(len(foo)))

Pour plus de détails, voir PEP 506.


27
2017-12-05 16:52



C'est le code avec une variable qui définit l'index aléatoire:

import random

foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1) 
print (foo[randomindex])
## print (randomindex)

C'est le code sans la variable:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])

Et c'est le code le plus court et le plus intelligent pour le faire:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

(python 2.7)


7
2018-05-25 14:57



foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

En python 2:

random_items = random.sample(population=foo, k=number_of_samples)

En python 3:

random_items = random.choices(population=foo, k=number_of_samples)

7
2017-11-29 16:40