Zidan
Zidan

Reputation: 135

Python list insert with index

I have an empty python list. and I have for loop that insert elements with index but at random (means indices are chosen randomly to insert the item). I tried a simple example, with randomly select indices, but it works in some indices but others won't work. Below is a simple example of what I wanna do:

a=[]
#a=[]

a.insert(2, '2')
a.insert(5, '5')
a.insert(0, '0')
a.insert(3, '3')
a.insert(1, '1')
a.insert(4, '4')

The output of this is a = ['0','1','2','5','4','3'] it's correct in the first three (0,1,2) but wrong in the last three ('5','4','3')

How to control insert to an empty list with random indices.

Upvotes: 0

Views: 3258

Answers (3)

Ivan Terreno
Ivan Terreno

Reputation: 53

If you have an empty array and you try to add some element in the third position, that element will be added in first position. Because python's list is a linked list.

You could resolve your problem creating a list with None values in it. This could be made with this:

# Creating a list with size = 10, so you could insert up to 10 elements.
a = [None] * 10
# Inserting the 99 in third position
a.insert(3,99)

Another way to do that is using numpy:

import numpy as np

# Create an empty array with 10 elements
a = np.empty(10,dtype=object)

# Insert 99 number in third position
np.insert(a, 3, 99)

print(a)
# array([None, None, None, 99, None, None, None, None, None, None, None],
#      dtype=object)

Upvotes: 1

Jan Christoph Terasa
Jan Christoph Terasa

Reputation: 5935

list.insert(i, e) will insert the element e before the index i, so e.g. for an empty list it will insert it as the first element.

Map out the operations in your head using this information:

a = [] # []
a.insert(2, '2') # ['2']
a.insert(5, '5') # ['2', '5']
a.insert(0, '0') # ['0', '2', '5']
a.insert(3, '3') # ['0', '2', '5', '3']
a.insert(1, '1') # ['0', '1', '2', '5', '3']
a.insert(4, '4') # ['0', '1', '2', '5', '4', '3']

Keep in mind that lists are not fixed sized arrays. The list has no predefined size, and can grow and shrink by appending or popping elements.


For what you might want to do you can create a list and use indexing to set the values.

If you know the target size (e.g. it is 6):

a = [None] * 6
a[2] = '2'
# ...

If you only know the maximum possible index, it would have to be done like this:

a = [None] * (max_index+1)
a[2] = '2'
# ...
a = [e for e in a if e is not None] # get rid of the Nones, but maintain ordering

If you do not know the maximum possible index, or it is very large, a list is the wrong data structure, and you could use a dict, like pointed out and shown in the other answers.

Upvotes: 3

Graeme Prentice-Mott
Graeme Prentice-Mott

Reputation: 312

If your values are unique, could you use them as keys in a dictionary, with the dict values being the index?

a={}
nums = [1,4,5,7,8,3] 

for num in nums:
    a.update({str(num): num})

sorted(a, key=a.get)

Upvotes: 1

Related Questions