This Python tutorial will discuss how to use the Python
random.sample()
function to choose multiple unique or sample items from a sequence, such as a list, string, and tuple. We will also discuss the methods or techniques to pick random items from a multi-dimensional array in Python.
Python has an inbuilt random module that provides many methods to generate random numbers or pick random values from a sequential object. sample() is one of the random modules which can pick random unique items from a sequential object and return it as a list.
Let's say we have a list of 100 student names, and we only need to pick 10 random students. All the 10 random students we pick should not be repeated. In this case, we can use the random.sample() function to and pick 10 random students out of 100.
Here is the overview of the functions that we will cover in this article.
Function | Description |
random.sample(population, n) | It will generate a list of n unique samples from the population sequence. |
random.choices(sequence, n) | The choices method randomly picks the n number of items from the sequence , with a possibility of repetitive items. |
random.sample(range(50), n) | It will return a list of n random integer numbers between 0 and 50(excluded). |
random.sample(dictionary.items, n) | It will return a list of n (key,pair) tuples from a dictionary object. |
How to use the random.sample function in Python?
The
random.sample(population, k, *,counts=None)
can accept 3 argument values, and return a list object by selecting
k
number of random sample items from the sequence
population
.
Syntax
import random
random.sample(population, k)
Arguments
-
population
: It can be a sequential object like list, tuple, and string, from which we want to select random items. -
k
: It is an integer value that decides the number of items that need to be picked randomly from the population sequence.
Note:
The value of
k
must be less than or equal to the total size of the population, otherwise the Python raises the ValueError(
Sample larger than population or is negative
).
random sample() example
Suppose we have a list of 10 students' names and we need to randomly select 3 students from the list.
import random
#ten students
students = ['Dev', 'Andy', 'Cindy', 'Beth', 'Ester','Rahul', 'Peter', 'Nancy', 'Mark', 'Shiv']
#select 3 random students
lucky_three = random.sample(students, k=3)
print("The three randomly picked students are: ", lucky_three)
Output
The three randomly picked students are: ['Peter', 'Andy', 'Cindy']
Important facts about random.sample function
The random.sample() function only pick unique objects from the sequential object. If the sequential objects have repeated values, they will be treated as different sample values, and sample() function will also pick them.
Example
import random
#list
balls = ['red', 'blue', 'green', 'red', 'red', 'red', 'green']
#pick random 4 values from balls list
print("The four randomly picked balls are: ", random.sample(balls, k=4))
Output
The four randomly picked balls are: ['red', 'red', 'green', 'green']
In the above example, you can see that the
balls
list has repeated items, but all of them are different objects. The sample() function only picks random unique objects, which means once the object is selected, it won't be selected again, but it does not consider the value of the objects.
For repeated data values, we can either define it inside the sequence, as we have done in the above example or use the sample() function
counts
argument.
Example
import random
#list
balls = ['red', 'blue', 'green']
#pick random 6 values from balls list
six_random_balls = random.sample(balls, counts=[2,3,4], k=6)
print("The six randomly picked balls are: ",six_random_balls )
Output
The six randomly picked balls are: ['green', 'blue', 'blue', 'green', 'red', 'green']
The above
random.sample(balls, counts=[2,3,4], k=6)
statement is equivalent to
six_random_balls =random.sample(['red','red','blue','blue','blue','green','green','green','green'], k=6)
.
Generate a Sampled list of random integers
In random modules, we have various functions to generate random numbers or integers. Using
random.randint(start, stop)
we can generate a single random integer number between the start and stop, both included. And with the help of list comprehension, we can generate a list of random integers.
Example
import random
#list of random numbers between 1000 and 9999
random_list = [random.randint(1000, 9999) for i in range(10)]
print("List of Random Numbers: ", random_list)
Output
List of Random Numbers: [4807, 7189, 8847, 1859, 2217, 9610, 7039, 8993, 3529, 9694]
The
random.randrange(start, stop, steps)
function can also generate a random number between the
start
and
stop
intervals with a specified number of
steps
. We can use this function with list comprehension and generate a list of random numbers.
Example
import random
#list of random even numbers between 1000 and 9999
random_list = [random.randrange(1000, 9999,2) for i in range(10)]
print("List of Random even Numbers: ", random_list)
Output
List of Random even Numbers: [3626, 9712, 4990, 9216, 4284, 3446, 1032, 7618, 5154, 2148]
using random.randint() and random.randrange() function we can generate a list of random integers. But there is a chance that the list generated by these two functions may contain duplicate or repeated integers. To generate a list of unique random numbers, we can take the help of random.sample() function along with range() function.
Example
let's generate a list of 10 unique random numbers between 1000, and 9999
import random
#list of 10 random even unique numbers between 1000 and 9999
random_list = random.sample(range(1000, 10000, 2), k=10)
print("List of Random even Numbers: ", random_list)
Output
List of Random even Numbers: [1902, 5948, 4882, 8614, 1392, 9990, 4908, 8584, 9178, 7616]
Generate a random sample from Python set
The
sample()
function for sets has been deprecated for Python version 3.9 and newer. And it will be no longer to sample out random items from the set in the upcoming versions of Python. We will get the output with the following warning if we try to pick out random items from a set using the sample() function.
DeprecationWarning: Sampling from a set deprecated since Python 3.9 and will be removed in a subsequent version.
To pick random items from a set without any warning or error, we can convert the set into a tuple or list and select the random items.
Example
import random
#set data
greeting = {'Hello', 'Hi', 'Hey','whats up', ' How are you?'}
random_sample = random.sample(list(greeting), k=2)
print("Random Sample: ", random_sample)
Output
Random Sample: ['Hi', 'Hello']
Generate a random sample from Python Dictionary
We can not directly apply the
random.sample()
function on a Python dictionary, it will throw a Key error. To get the random items from the Python dictionary, we first need to convert the dictionary into a list of key, value tuple pairs using the
dict.items()
and
list()
functions.
Example
import random
mobiles = {
'iphone 13 pro max':129_900,
'samsung galaxy z fold 3': 149_999,
'samsung galazy s21 ultra':94_900,
'onepluse 9 pro': 94_999,
'asus rog 5': 49_999
}
#select two random mobiles from the prices
random_mobiles = random.sample(list(mobiles.items()), k=2)
#convert the random_mobiles list to dictionary
print("Random Mobiles: ", dict(random_mobiles))
Output
Random Mobiles: {'onepluse 9 pro': 94999, 'samsung galaxy z fold 3': 149999}
The dict.items() method return a dict_items() which is a list like object but not list. To convert it into a list, we used the list function in the above example.
How to select the same items, again and again, using the sample function?
Let's say you want to create a biased script that uses random.sample() function and pick the same items from the sequence. This can be done by setting the random seed. By default, to perform random tasks or generate random numbers, the operating system uses seed to initialize a pseudorandom number generator. By setting it to a constant value, we can generate the same output value from the random functions like random.sample().
Example
Let's generate the three same lists of 5 random numbers using
random.seed()
and
random.sample()
functions.
import random
#list from 10 to 99
my_list = list(range(10, 100))
for i in range(3):
#set seed to 4
random.seed(4)
print(f"{i+1} random integer list: ", random.sample(my_list, k=5))
Output
1 random integer list: [40, 48, 23, 60, 71]
2 random integer list: [40, 48, 23, 60, 71]
3 random integer list: [40, 48, 23, 60, 71]
In the output, you can see for every iteration the sample() function selects the same random items for the list. This is because we have set the seed value to a specific constant.
How to select a random array from a multi-dimensional array in Python?
Python's numpy library comes with a dedicated class for random data. With
numpy.random.choice()
function, we can pick random items from an array. The downside of the
numpy.random.choice()
is it only selects random items from a 1-D array.
To select random items from a multi-dimensional array, we first have to convert it to a 1D array using ravel() method, then select the random items. At last, we can reshape the random array to the multi-dimensional array using reshape() function.
Example
import numpy as np
md_array = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]])
#convert the multi dimensional array to 1d array
array = md_array.ravel()
#select 10 random items from the array
random_array = np.random.choice(array, 10)
#convert the 1d random array to multi dimensaional array
multi_d_array = random_array.reshape(5,2)
print("The random multi-dimensional array is:\n", multi_d_array)
Output
The random multi-dimensional array is:
[[16 2]
[13 13]
[ 7 5]
[ 6 16]
[16 12]]
Common Exception and Error while using random.sample() function
There are two common exceptions and one common warning when we incorrectly use the
random.sample()
function.
1. TypeError
This error generally occurs when we forget to pass the 2nd argument value (the value of
k
).
Example
random.sample(range(10))
In the above statement, we did not pass the value of
k
, which is a mandatory argument, that's why Python will raise the TypeError with the following message
Random.sample()
missing 1 required positional argument
: 'k'
. We can also get the TypeError for the sample function when selecting random items from a dictionary object.
Example
import random
#dictionary
shortcuts = {'ctrl+c': 'copy', 'ctrl+p':'paste', 'ctrl+s':'save'}
random_data = random.sample(shortcuts, k=2)
print(random_data)
In this example
shortcuts
is a dictionary object and sample() function does not accept dictionary as an argument and return the TypeErro with the following error message
Population must be a sequence. For dicts or sets, use sorted(d).
2. ValueError
The
random.sample()
function throws the ValueError when the value of
k
larger than the size of the population or sequence.
Example
import random
random_data = random.sample(range(10), k=100)
print(random_data)
The above example will raise the following error
ValueError: Sample larger than population or is negative
Because the sequence length is 10, and we are trying to get 40 items in the sample list.
3.
DeprecationWarning
The Python3.9 and newer versions do not support
random.sample()
for set data type and throw the warning.
DeprecationWarning: Sampling from a set deprecated
.
Conclusion
The random.sample(population,k) function can select k number of random unique items from a sequential object and return them as a list. The sample() function does not accept set and dictionary objects as argument values for the population. The sample() method comes very useful when we want to select random items from a list, tuple, or string. It is a perfect alternative for the random.choices() function.
That's it about our article on the Python random.sample() function. If you like this article or have any queries related to the above examples and explanations, please share your thoughts in the comment section.
People are also reading:
Leave a Comment on this Post