Create An Empty List In Python With Certain Size


Answer :

You cannot assign to a list like lst[i] = something, unless the list already is initialized with at least i+1 elements. You need to use append to add elements to the end of the list. lst.append(something).



(You could use the assignment notation if you were using a dictionary).



Creating an empty list:



>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]


Assigning a value to an existing element of the above list:



>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]


Keep in mind that something like l[15] = 5 would still fail, as our list has only 10 elements.



range(x) creates a list from [0, 1, 2, ... x-1]



# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


Using a function to create a list:



>>> def display():
... s1 = []
... for i in range(9): # This is just to tell you how to create a list.
... s1.append(i)
... return s1
...
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]


List comprehension (Using the squares because for range you don't need to do all this, you can just return range(0,9) ):



>>> def display():
... return [x**2 for x in range(9)]
...
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]


Try this instead:



lst = [None] * 10


The above will create a list of size 10, where each position is initialized to None. After that, you can add elements to it:



lst = [None] * 10
for i in range(10):
lst[i] = i


Admittedly, that's not the Pythonic way to do things. Better do this:



lst = []
for i in range(10):
lst.append(i)


Or even simpler, in Python 2.x you can do this to initialize a list with values from 0 to 9:



lst = range(10)


And in Python 3.x:



lst = list(range(10))


varunl's currently accepted answer



 >>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]


Works well for non-reference types like numbers. Unfortunately if you want to create a list-of-lists you will run into referencing errors. Example in Python 2.7.6:



>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>>


As you can see, each element is pointing to the same list object. To get around this, you can create a method that will initialize each position to a different object reference.



def init_list_of_objects(size):
list_of_objects = list()
for i in range(0,size):
list_of_objects.append( list() ) #different object reference each time
return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>>


There is likely a default, built-in python way of doing this (instead of writing a function), but I'm not sure what it is. Would be happy to be corrected!



Edit: It's [ [] for _ in range(10)]



Example :



>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]


Comments

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"