python - How can I randomly select an item from a list?

ID : 416

viewed : 70

Tags : pythonlistrandompython

Top 5 Answer for python - How can I randomly select an item from a list?

vote vote

99

Use random.choice():

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

For cryptographically secure random choices (e.g., for generating a passphrase from a wordlist), use secrets.choice():

import secrets  foo = ['battery', 'correct', 'horse', 'staple'] print(secrets.choice(foo)) 

secrets is new in Python 3.6. On older versions of Python you can use the random.SystemRandom class:

import random  secure_random = random.SystemRandom() print(secure_random.choice(foo)) 
vote vote

80

If you want to randomly select more than one item from a list, or select an item from a set, I'd recommend using random.sample instead.

import random group_of_items = {'a', 'b', 'c', 'd', 'e'}  # 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]  

If you're only pulling a single item from a list though, choice is less clunky, as using sample would have the syntax random.sample(some_list, 1)[0] instead of random.choice(some_list).

Unfortunately though, choice only works for a single output from sequences (such as lists or tuples). Though random.choice(tuple(some_set)) may be an option for getting a single item from a set.

EDIT: Using Secrets

As many have pointed out, if you require more secure pseudorandom samples, you should use the secrets module:

import secrets                              # imports secure module. secure_random = secrets.SystemRandom()      # creates a secure random object. group_of_items = {'a', 'b', 'c', 'd', 'e'}  # 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] 

EDIT: Pythonic One-Liner

If you want a more pythonic one-liner for selecting multiple items, you can use unpacking.

import random first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2) 
vote vote

74

If you also need the index, use random.randrange

from random import randrange random_index = randrange(len(foo)) print(foo[random_index]) 
vote vote

66

As of Python 3.6 you can use the secrets module, which is preferable to the random module for cryptography or security uses.

To print a random element from a list:

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

To print a random index:

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

For details, see PEP 506.

vote vote

57

I propose a script for removing randomly picked up items off a list until it is empty:

Maintain a set and remove randomly picked up element (with choice) until list is empty.

s=set(range(1,6)) import random  while len(s)>0:   s.remove(random.choice(list(s)))   print(s) 

Three runs give three different answers:

>>>  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([]) 

Top 3 video Explaining python - How can I randomly select an item from a list?

Related QUESTION?