How to shuffle list in Python using random.shuffle() function?

By | February 13, 2022
How to shuffle list in Python using random.shuffle() function?

In this Python tutorial, we will discuss the different functions and methods provided by the Python modules to shuffle the items of a list. We will also see how can we use the same method to shuffle the characters and items of any other sequential object like string, tuple, and dictionary.

In this tutorial the methods or functions that we are going to cover are

Function Description
random.shuffle(list_name) It performs the in-place operation and shuffle the actual list.
random.sample(list_name, len(list_name)) It also shuffles the list but does not perform the shuffling on the actual list. Instead, create a copy of the list, perform shuffling and return the new list.
numpy.random.shuffle(array) It is a numpy method to shuffle multidimensional numpy array.

Shuffle Python list with random.shuffle() function

The Python inbuilt random module provides a method shuffle(x), that can shuffle the items of a sequential object like list.

Using the shuffle()  function we can perform the in-place shuffling on a list.

Syntax

import random

random.shuffle(x[, random])

The shuffle method can accept two argument values.

  1. xIt is the sequential object (list) which items or characters need to be shuffled.
  2. random: It is an optional argument, representing the random() function of the random module. It is the same function random.random() that returns a random float number value between 0.1 to 1.0.

Return Value

The shuffle perform the in-place operation, made the changes on the actual value, and return None.

Steps to shuffle a list in Python

Here are the basics step to shuffle a list

Vamware

Step 1: Import the random module

random is an inbuilt Python module, we can import it on our list using the import statement.

import random

Vamware

step 2: Create a List

Now we need to create a list, to create a list we can either use the list() function or the square bracket nation [].

x = [1,2,3,4,5]

step 3: shuffle the list using the random.shuffle() function

Use the random.shuffle() function to shuffle the list x.

random.shuffle(x)

Do not reassign the return value of shuffle back to list, because it returns None.

Vamware

Python shuffle() example

Let’s see an example of shuffling a list in Python.

#import the random module
import random

#the list to shuffle
x = [50, 59, 63, 65, 66, 70, 78, 79, 86, 97, 100]

#shuffle the list using the shuffle function
random.shuffle(x)

#print the shuffled list
print(x)
#output [59, 79, 63, 100, 70, 78, 66, 86, 97, 50, 65]


#shuffle the list again
random.shuffle(x)
print(x)
#output [50, 63, 78, 65, 86, 59, 66, 79, 70, 100, 97]

Example 2

Suppose we have two lists representing the deck of cards. The first list represents the shape of the card, and the second list represents the number of cards. Now we need to write a script that shuffles both lists and pick the first 3 cards.

import random

#shape
card_shape = ['SPADE','HEART','DIAMOND','CLUB']

#number 1 to 13
card_numbers = list(range(1, 14))

#shuffle both the list
random.shuffle(card_shape)
random.shuffle(card_numbers)

#print the first 3 random cards
print("Your 3 cards are:")
print(card_numbers[0], "of", card_shape[0])
print(card_numbers[1], "of", card_shape[1])
print(card_numbers[2], "of", card_shape[2])

Output

Your 3 cards are:
2 of CLUB
3 of DIAMOND
10 of SPADE

Not in Place shuffling with Python shuffle() function

The shuffle() function, shuffles the list items in place. And if we do not want to perform the shuffling on the actual list, we have to create a copy of the list and then apply the shuffle method on the copied list.

To create a copy of the list we can use the copy() method, the copy method creates a shallow copy of the list and returns a new list.

Example

#import the random module
import random

#the list to shuffle
x = [50, 59, 63, 65, 66, 70, 78, 79, 86, 97, 100]

#copy the list
copied_list = x.copy()

#shuffle the copied list
random.shuffle(copied_list)

#print the actuale list
print("The actual list (x) is: ", x)

#print the copied shuffled list
print("The shuffled list is: ", copied_list)

Output

The actual list (x) is: [50, 59, 63, 65, 66, 70, 78, 79, 86, 97, 100]
The shuffled list is: [86, 50, 66, 79, 59, 65, 97, 100, 63, 78, 70]

Note: Do not use the assignment operator = to copy the list e.g. copied_list = x. It will not copy the list, instead, it will create a new list name copied_list that will also be pointing to the same list object as x.

No inplace list shuffling with random.sample() function.

In the above example, we see how can we create a copy of a list, shuffle using the shuffle() function, so it does not affect the actual list.

The random method also provide a sample(x, k) method which can return the k a number of randomly picked items from the sequential object x.

We can use the sample() method to shuffle a list object when we do not want to perform the in-place shuffling.

Syntax

import random

random.sample(population, k)

The sample() method has two mandatory arguments.

population: It is a sequential object like list, tuple, string, set, and dictionary. that we want to shuffle.

kDefine the number of elements that we want to choose from the population sequence.

Return value

It returns a list of k random items from the population object.

Example

Let’s shuffle a list using the sample() function.

When we want to shuffle a list with the sample() function, the value of k must be equal to the length of the list.

#import the random module
import random

#the list to shuffle
x = [50, 59, 63, 65, 66, 70, 78, 79, 86, 97, 100]

#shuffled list
shuffled = random.sample(x, k =len(x))

#print the actual list
print("The actual list (x) is: ", x)

#print the copied shuffled list
print("The shuffled list is: ", shuffled)

How to shuffle a Numpy Multidimensional Array?

With the help of the random.shuffle() and random.sample() methods we can only shuffle a one-dimensional numpy array.

Note: With sample(), we first need to change the numpy array to list using the list function then only we can shuffle it with sample() function.

Example 

import numpy as np
import random

#numpy 1d array
array1= np.array([1,2,3,4,5])

array2 = np.array([101,102,103,104])


#shuffle array1 with shuffle
random.shuffle(array1)

print(array1)
#output [1 3 4 5 2]

#shuffle array2 with sample
print(random.sample(list(array2), k= len(array2)))
#output [104, 102, 103, 101]

But when we deal with a multi-dimensional NumPy array there we can not simply use these shuffle() or sample() functions to shuffle the items of the array.

To shuffle a multi-dimensional numpy array we can use the np.random.shuffle() function. The numpy module comes with its own random class and multiple methods that are inherited from the random modules and compatible with numpy arrays.

Example

Let’s create a multi-dimensional numpy array and shuffle its items using the numpy.random.shuffle().

import numpy as np

#multi dimensional array
multi_d_array  = np.array(
        [[1,2],[3,4], [5,6], [8,9]], np.int32)

print("Multi-D Array before Shuffling")
print(multi_d_array)

#shuffle the array
np.random.shuffle(multi_d_array)

print("\nMulti-D Array After Shuffling")
print(multi_d_array)

Output

Multi-D Array before Shuffling
[[1 2]
 [3 4]
 [5 6]
 [8 9]]

Multi-D Array After Shuffling
[[3 4]
 [5 6]
 [1 2]
 [8 9]]

How to get the same result with each shuffle()

The shuffle method uses the random function to shuffle the sequence items. The random method also provides the seed() method which can modify the start point when a computer generates a random value.

Generally, the random number generator uses the random seed(the start point when a computer generates a random number). With the help of random.seed() method we can modify the seed value, make it constant so every time the random method generates the same random value and shuffle the same result.

Example

Let’s write a script that shuffles the list with the shuffle() function but shows the same result.

import random

import random

#list
x = [20, 30, 40, 50, 60]

#shuffle the 10 times
for i in range(10):
    #seed the starting random points
    random.seed(20)

    #shuffle the list
    random.shuffle(x)

    print(f"Shuffled list {i+1}", x)

Output

Shuffled list 1 [60, 20, 50, 40, 30]
Shuffled list 2 [30, 60, 40, 50, 20]
Shuffled list 3 [20, 30, 50, 40, 60]
Shuffled list 4 [60, 20, 40, 50, 30]
Shuffled list 5 [30, 60, 50, 40, 20]
Shuffled list 6 [20, 30, 40, 50, 60]
Shuffled list 7 [60, 20, 50, 40, 30]
Shuffled list 8 [30, 60, 40, 50, 20]
Shuffled list 9 [20, 30, 50, 40, 60]
Shuffled list 10 [60, 20, 40, 50, 30]

In the output, you can see that even after a constant seed value the output result of every shuffling is not the same. This is because the shuffle method performs the in-place operation, and with every shuffling the list items’ position changes in place, and the shuffle function performs a new operation on a brand new list.

Still, you can see that because of the seed(20) there are many common shuffle values.

We can see the full potential of the seed function with the sample() function. The sample() function does not change the actual list which means with constant seed if we try to get a shuffle list with sample function we will get the same shuffled list every time.

Example

import random

#list
x = [20, 30, 40, 50, 60]

#shuffle the 10 times
for i in range(10):
    #seed the starting random points
    random.seed(20)

    #shuffle the list
    print(f"Shuffled list {i+1}", random.sample(x, k=len(x)))

Output

Shuffled list 1 [30, 40, 50, 20, 60]
Shuffled list 2 [30, 40, 50, 20, 60]
Shuffled list 3 [30, 40, 50, 20, 60]
Shuffled list 4 [30, 40, 50, 20, 60]
Shuffled list 5 [30, 40, 50, 20, 60]
Shuffled list 6 [30, 40, 50, 20, 60]
Shuffled list 7 [30, 40, 50, 20, 60]
Shuffled list 8 [30, 40, 50, 20, 60]
Shuffled list 9 [30, 40, 50, 20, 60]
Shuffled list 10 [30, 40, 50, 20, 60]

How Shuffle a String in Python?

The random.shuffle() method cannot shuffle a string value. And if we try to shuffle a string object using shuffle() function we receive the TypeError: 'str' object does not support item assignment Error.

This makes sense, the shuffle performs the in-place operation and the string is an immutable data structure, and when we try to shuffle it in-place with the shuffle() function we receive the error.

 Example

import random

string = "TechGeekBuzz"

random.shuffle(string)

print(string) 
#Error TypeError: 'str' object does not support item assignment

In order to shuffle a string, we can either use the sample()  function or convert the string into a list, shuffle it with the shuffle function, and convert the list back to the string.

Example 1 Shuffle the string by converting it into list

import random

#string
string = "TechGeekBuzz Hello"

#convert the string into list
letters = list(string)

#shuffle the list
random.shuffle(letters)

#convert the shuffled letters back to string to create a shuffled string
string = "".join(letters)

print(string)

Output

zzeoeulecBeGhTkl H

Example 2 Shuffle a string with the sample function

import random

#string
string = "TechGeekBuzz Hello"

#shuffle the string
letters = random.sample(string, k=len(string))

#convert the shuffled letters back to string to create a shuffled string
string = "".join(letters)

print(string)

Output

zuHeoe ThkclBlzGee

How Shuffle a Dictionary in Python?

The shuffle method can only work on a dictionary object if all the keys of the dictionary are integer values.

Example

import random

#dictionary
#{0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106, 7: 107, 8: 108, 9: 109}
a= dict(zip(range(10), range(100, 110)))

print("Dictionary before shuffling")
print(a)

#shuffle the dictionary a
random.shuffle(a)

print("Dictionary after shuffling")
print(a)

Output

Dictionary before shuffling
{0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106, 7: 107, 8: 108, 9: 109}
Dictionary after shuffling
{0: 103, 1: 108, 2: 104, 3: 107, 4: 101, 5: 106, 6: 109, 7: 105, 8: 100, 9: 102}

And if any of the dictionary keys is a string or of any other data type the shuffle method will throw the KeyError.

To shuffle a dictionary with different data type keys, we first need to change the dictionary into a list of (key, value) tuple pairs, shuffle it and convert it back into a dictionary using the dict() function.

import random

#dictionary
#{0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106, 7: 107, 8: 108, 9: 109}
a= dict(zip(range(10), range(100, 110)))

print("Dictionary before shuffling")
print(a)

#list of (key,value) tuples
a = list(a.items())

#shuffle the list
random.shuffle(a)

#convert the list into dictionary
a = dict(a)

print("Dictionary after shuffling")
print(a)

Output

Dictionary before shuffling
{0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106, 7: 107, 8: 108, 9: 109}
Dictionary after shuffling
{0: 100, 3: 103, 6: 106, 8: 108, 4: 104, 1: 101, 2: 102, 9: 109, 5: 105, 7: 107}

Conclusion

The random module has two methods to shuffle a list in Python, shuffle(), and sample(). The shuffle() method accepts the list object as an argument, shuffles it in place, and returns None. The sample() method can also shuffle a list object, but it picks the k number of random items from a sequential object and returns it as a list.

To shuffle a numpy multi-dimensional array, the numpy module itself comes a random class with the shuffle() method to shuffle the array.

People are also reading:

Leave a Reply

Your email address will not be published.