web-dev-qa-db-fra.com

Comment sélectionner au hasard un élément dans 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?

1605
Ray Vega

Utilisez random.choice()

_import random

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

Pour des choix aléatoires sécurisés par cryptographie (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))
_

ou secrets.choice()

_import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
_
2517
Pēteris Caune

Si vous souhaitez sélectionner au hasard plus d'un élément dans une liste ou sélectionner un élément dans un jeu, je vous recommande d'utiliser random.sample à la place.

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] 

Cependant, si vous ne tirez qu'un seul élément d'une liste, le choix est moins compliqué, car utiliser sample aurait la syntaxe random.sample(some_list, 1)[0] au lieu de random.choice(some_list).

Malheureusement, cependant, 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)) puisse être une option pour obtenir un seul élément d'un ensemble.

EDIT: Using Secrets

Comme beaucoup l'ont fait remarquer, si vous avez besoin d'échantillons pseudo-aléatoires plus sécurisés, utilisez le module secrets:

import secrets                              # imports secure module.
secure_random = secrets.SystemRandom()      # creates a secure random object.
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 = secure_random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
162
Paul

Si vous avez également besoin de l'index, utilisez random.randrange

_from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
_
148
Juampi

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

Pour imprimer un élément aléatoire 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 .

36
Chris_Rands

Je propose un script pour supprimer les éléments choisis au hasard dans une liste jusqu'à ce qu'elle soit vide:

Conservez un set et enlevez 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 pistes 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([])
32
kiriloff
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

Dans python 2:

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

Dans python 3:

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

Comment sélectionner au hasard un élément dans 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?

Si vous voulez près de vraiment aléatoire, alors je vous suggère d'utiliser un objet SystemRandom du module random avec la méthode choice:

>>> import random
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']

Et maintenant:

>>> sr.choice(foo)
'd'
>>> sr.choice(foo)
'e'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'b'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'c'
>>> sr.choice(foo)
'c'

Si vous voulez une sélection pseudo-aléatoire déterministe, utilisez la fonction choice (qui est en fait une méthode liée sur un objet Random):

>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>

Cela semble aléatoire, mais ce n’est pas le cas, ce que nous pourrons voir si nous le réensemencons à plusieurs reprises:

>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
9
Aaron Hall

numpy solution: numpy.random.choice

Pour cette question, cela fonctionne de la même manière que la réponse acceptée (import random; random.choice()), mais je l’ai ajoutée car le programmeur a peut-être déjà importé numpy (comme moi) et aussi quelques différences entre les deux méthodes pouvant concerner votre cas d'utilisation réel.

_import numpy as np    
np.random.choice(foo) # randomly selects a single item
_

Pour la reproductibilité, vous pouvez faire:

_np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'
_

Pour des exemples de un ou plusieurs éléments , renvoyés sous forme de array, transmettez l'argument size:

_np.random.choice(foo, 5)          # sample with replacement (default)
np.random.choice(foo, 5, False)   # sample without replacement
_
8
C8H10N4O2

si vous avez besoin de l'index, utilisez simplement:

import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]

random.choice fait la même chose :)

8
Janek Olszak

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 voici le code de la manière la plus rapide et la plus intelligente de le faire:

import random

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

(Python 2.7)

7
Liam

Nous pouvons aussi faire cela en utilisant randint.

from random import randint
l= ['a','b','c']

def get_Rand_element(l):
    if l:
        return l[randint(0,len(l)-1)]
    else:
        return None

get_Rand_element(l)
2
Abdul Majeed

Le code suivant montre si vous devez produire les mêmes éléments. Vous pouvez également spécifier le nombre d'échantillons que vous souhaitez extraire.
La méthode sample renvoie une nouvelle liste contenant des éléments de la population tout en laissant la population d'origine inchangée. La liste résultante est dans l'ordre de sélection afin que toutes les sous-tranches soient également des échantillons aléatoires valides.

import random as random
random.seed(0)  # don't use seed function, if you want different results in each run
print(random.sample(foo,3))  # 3 is the number of sample you want to retrieve

Output:['d', 'e', 'a']
2
Memin

Une solution simple si vous recherchez quelque chose comme ceci:

from random import *
library = ["New York", "Berlin", "Rome"]

for x in range (10):
    i = randrange(0,3)
    print(library[i])
2
lorde

Sélection d'élément aléatoire:

import random

my_list = [1, 2, 3, 4, 5]
num_selections = 2

new_list = random.sample(my_list, num_selections)

Pour préserver l'ordre de la liste, vous pouvez faire:

randIndex = random.sample(range(len(my_list)), n_selections)
randIndex.sort()
new_list = [my_list[i] for i in randIndex]

Doublon de https://stackoverflow.com/a/49682832/4383027

0
Solomon Vimal
import random
list=range(100)
random_value=random.choice(list)
print(random_value)
0
Ravi G