Open In App

Python – Random insertion of elements K times

Last Updated : 17 May, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given 2 list, insert random elements from List 2 to List 1, K times at random position.

Input : test_list = [5, 7, 4, 2, 8, 1], add_list = [“Gfg”, “Best”, “CS”], K = 2 Output : [5, 7, 4, 2, 8, 1, ‘Best’, ‘Gfg’] Explanation : Random elements from List 2 are added 2 times. Input : test_list = [5, 7, 4, 2, 8, 1], add_list = [“Gfg”, “Best”, “CS”], K = 1 Output : [5, 7, 4, 2, 8, 1, ‘Gfg’] Explanation : Random elements from List 2 are added 1 times.

Method : Using randint() + list slicing + loop + choice()

In this, choice() is used to get random elements from list 2 to insert into list 1 and, randint() is used to get index at which this needs to be inserted. Then list slicing is used to remake list according to newer order.

Python3




# Python3 code to demonstrate working of
# Random insertion of elements K times
# Using randint() + list slicing + loop + choice()
import random
 
# initializing list
test_list = [5, 7, 4, 2, 8, 1]
 
# printing original list
print("The original list : " + str(test_list))
 
# initializing add list
add_list = ["Gfg", "Best", "CS"]
 
# initializing K
K = 3
 
for idx in range(K):
     
    # choosing index to enter element
    index = random.randint(0, len(test_list))
     
    # reforming list and getting random element to add
    test_list = test_list[:index] + [random.choice(add_list)] + test_list[index:]
 
# printing result
print("The created List : " + str(test_list))


Output

The original list : [5, 7, 4, 2, 8, 1]
The created List : ['CS', 'CS', 5, 7, 4, 'CS', 2, 8, 1]

Time complexity: O(n*n), where n is the length of the test_list. The randint() + list slicing + loop + choice() takes O(n*n) time
Auxiliary Space: O(n), extra space of size n is required

Method #2: Using random.choice()

step-by-step approach :

1. Define the function insert_random_elements which takes three arguments: test_list, add_list, and K.
2. Create a range object range_obj that contains the indices where new elements can be inserted. The range object should span from 0 to the length of test_list plus K.
3. Loop over K times.
4. Generate a random index rand_index using random.choice(range_obj) to randomly select an index from range_obj.
5. Insert a random element from add_list into test_list at the randomly chosen index.
6. Return the modified test_list.

Python3




import random
 
def insert_random_elements(test_list, add_list, K):
    # Create range object for indices where new elements can be inserted
    range_obj = range(len(test_list) + K)
 
    # Insert elements K times
    for i in range(K):
        # Generate random index
        rand_index = random.choice(range_obj)
 
        # Insert random element at random index
        test_list.insert(rand_index, random.choice(add_list))
 
    return test_list
test_list = [5, 7, 4, 2, 8, 1]
add_list = ["Gfg", "Best", "CS"]
K = 3
print(insert_random_elements(test_list, add_list, K))


Output

[5, 7, 4, 'Best', 'Best', 2, 8, 1, 'Best']

time complexity: O(K^2) 

space complexity: O(1)

Method #3: Using numpy:

Algorithm:

  1. Create a for loop to iterate K times.
  2. Generate a random index between 0 and len(test_list) – 1.
  3. Save the element at the random index to a variable called old_element.
  4. Choose a random element from add_list and set it as the element at the random index in test_list.
  5. Insert old_element after the new element at the random index.
  6. Return the modified test_list with randomly inserted elements.

Python3




import random
import numpy as np
 
def insert_random_elements(test_list, add_list, K):
    for i in range(K):
        # Generate random index
        rand_index = random.randint(0, len(test_list) - 1)
 
        # Insert random element at random index and remove old element
        old_element = test_list[rand_index]
        new_element = np.random.choice(add_list)
        test_list[rand_index] = new_element
        test_list.insert(rand_index + 1, old_element)
 
    return test_list
 
test_list = [5, 7, 4, 2, 8, 1]
add_list = ["Gfg", "Best", "CS"]
K = 3
print(insert_random_elements(test_list, add_list, K))
#This code is contributed by Jyothi Pinjala.


Output:

[5, 7, 4, ‘Gfg’, ‘CS’, ‘CS’, 2, 8, 1]

Time complexity:

Generating a random index using random.randint(0, len(test_list) – 1) takes O(1) time.
Choosing a random element from add_list using np.random.choice(add_list) takes O(1) time.
Inserting a new element into test_list at a given index using insert() takes O(n) time, where n is the length of test_list.
Therefore, the overall time complexity of the insert_random_elements() function is O(K * n), where K is the number of random elements to insert and n is the length of test_list.

Auxiliary Space:

The function uses O(K) additional space to store the old_element variable for each insertion.
The function also modifies the input test_list in place, so the space complexity for that is O(1).
Therefore, the overall space complexity of the insert_random_elements() function is O(K).

Approach#4: Using lambda+map

Create a list of random elements from add_list using the map() function and lambda function. Append the generated list to the original test_list using the + operator. Return the resultant list.

Algorithm

1. Initialize the test_list, add_list and K values.
2. Generate a list of K random elements from the add_list using map() function and lambda function.
3. Append the generated list to the test_list using + operator.
4. Return the resultant list.

Python3




import random
 
test_list = [5, 7, 4, 2, 8, 1]
add_list = ["Gfg", "Best", "CS"]
K = 2
 
result_list = test_list + list(map(lambda x: random.choice(add_list), range(K)))
print(result_list)


Output

[5, 7, 4, 2, 8, 1, 'Best', 'CS']

Time Complexity: O(K), as the time complexity of generating a list of K random elements using map() function and lambda function is O(K) and appending two lists using + operator takes O(n) time where n is the length of the list.

Auxiliary Space: O(K), as the space complexity of generating a list of K random elements using map() function and lambda function is O(K) and the space complexity of storing the resultant list is also O(K).



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads