Open In App

Python | All possible permutations of N lists

Computing permutations is always a necessary task in many of the practical applications and a concept widely used in Mathematics to achieve solutions to many practical problems. Lets discuss certain ways in which one can perform the task of getting all the permutations of N lists. 

Method #1 : Using list comprehension List comprehension can be used to convert the naive method task into a single line, hence more compact. This method checks for each element available elements and makes pairs accordingly. 






# Python3 code to demonstrate
# to compute all possible permutations
# using list comprehension
 
# initializing lists
list1 = [1, 3, 4]
list2 = [6, 7, 9]
list3 = [8, 10, 5]
 
# printing lists
print ("The original lists are : " + str(list1) +
                            " " + str(list2) +
                            " " + str(list3))
 
# using list comprehension
# to compute all possible permutations
res = [[i, j, k] for i in list1
                for j in list2
                for k in list3]
 
# printing result
print ("All possible permutations are : " + str(res))

Output
The original lists are : [1, 3, 4] [6, 7, 9] [8, 10, 5]
All possible permutations are : [[1, 6, 8], [1, 6, 10], [1, 6, 5], [1, 7, 8], [1, 7, 10], [1, 7, 5], [1, 9, 8], [1, 9, 10], [1, 9, 5], [3, 6, 8], [3, 6, 10], [3, 6, 5], [3, 7, 8], [3, 7, 10], [3, 7, 5], [3, 9, 8], [3, 9, 10], [3, 9, 5], [4, 6, 8], [4, 6, 10], [4, 6, 5], [4, 7, 8], [4, 7, 10], [4, 7, 5], [4, 9, 8], [4, 9, 10], [4, 9, 5]]

Time Complexity: O(n3) where n is the length of the list.
Space Complexity: O(n3) where n is the length of the list.



Method #2 : Using itertools.product() Using product function, one can easily perform this task in more pythonic and concise manner. This is most recommended method to perform this task of computing cartesian product. 
 




# Python3 code to demonstrate
# to compute all possible permutations
# using itertools.product()
import itertools
 
# initializing list of list
all_list = [[1, 3, 4], [6, 7, 9], [8, 10, 5] ]
 
# printing lists
print ("The original lists are : " + str(all_list))
 
# using itertools.product()
# to compute all possible permutations
res = list(itertools.product(*all_list))
 
# printing result
print ("All possible permutations are : " + str(res))

Output
The original lists are : [[1, 3, 4], [6, 7, 9], [8, 10, 5]]
All possible permutations are : [(1, 6, 8), (1, 6, 10), (1, 6, 5), (1, 7, 8), (1, 7, 10), (1, 7, 5), (1, 9, 8), (1, 9, 10), (1, 9, 5), (3, 6, 8), (3, 6, 10), (3, 6, 5), (3, 7, 8), (3, 7, 10), (3, 7, 5), (3, 9, 8), (3, 9, 10), (3, 9, 5), (4, 6, 8), (4, 6, 10), (4, 6, 5), (4, 7, 8), (4, 7, 10), (4, 7, 5), (4, 9, 8), (4, 9, 10), (4, 9, 5)]

Time Complexity: O(nk) where n is the number of lists and k is the number of elements of each list.
Auxiliary Space: O(nk) where n is the number of lists and k is the number of elements of each list.

Method #3: Using numpy

In this method, numpy library is used to create a 3D array of all possible combinations of elements from the three lists using the np.meshgrid() function. The resulting 3D array is reshaped into a 2D array and stored in the res variable.




import numpy as np
 
# initializing lists as arrays
list1 = np.array([1, 3, 4])
list2 = np.array([6, 7, 9])
list3 = np.array([8, 10, 5])
 
# printing arrays
print("The original arrays are:")
print(list1)
print(list2)
print(list3)
 
# using NumPy meshgrid and stack
# to compute all possible permutations
X, Y, Z = np.meshgrid(list1, list2, list3)
res = np.column_stack((X.ravel(), Y.ravel(), Z.ravel()))
 
# printing result
print("All possible permutations are:")
print(res)
 
# Contributed by rishabmalhdijo

Output: 

Output

Time Complexity: O(n3) where n is the length of each list
Space Complexity: O(n3), because the resulting 3D array has to be stored in memory.


Article Tags :