note.nkmk.me

Initialize a list with given size and values in Python

Posted: 2020-10-19 / Tags: Python, List

This post describes how to initialize a list with an arbitrary size (number of elements) and values in Python.

  • Create an empty list
  • Initialize a list with an arbitrary size and values
  • Notes on initializing a 2D list (list of lists)
  • For tuples and arrays
Sponsored Link

Create an empty list

An empty list is created as follows. You can get the number of elements of a list with the built-in function len().

l_empty = []
print(l_empty)
# []

print(len(l_empty))
# 0

You can add an element by append() or remove it by remove().

l_empty.append(100)
l_empty.append(200)
print(l_empty)
# [100, 200]

l_empty.remove(100)
print(l_empty)
# [200]

See the following posts for details on adding and removing elements from lists,

Initialize a list with an arbitrary size and values

As mentioned above, in Python, you can easily add and remove elements from a list, so there are few situations where you need to initialize a list in advance.

If you want to initialize a list of arbitrary number of elements where all elements are filled with arbitrary values, you can use the * operator as follows.

l = [0] * 10
print(l)
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

print(len(l))
# 10

A list is generated that repeats the elements of the original list.

print([0, 1, 2] * 3)
# [0, 1, 2, 0, 1, 2, 0, 1, 2]

You can generate a list of sequential numbers with range().

Sponsored Link

Notes on initializing a 2D list (list of lists)

Be careful when initializing a list of lists.

The following code is no good.

l_2d_ng = [[0] * 4] * 3
print(l_2d_ng)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

If you update one list, all the lists will be changed.

l_2d_ng[0][0] = 5
print(l_2d_ng)
# [[5, 0, 0, 0], [5, 0, 0, 0], [5, 0, 0, 0]]

l_2d_ng[0].append(100)
print(l_2d_ng)
# [[5, 0, 0, 0, 100], [5, 0, 0, 0, 100], [5, 0, 0, 0, 100]]

This is because the inner lists are all the same object.

print(id(l_2d_ng[0]) == id(l_2d_ng[1]) == id(l_2d_ng[2]))
# True

You can write as follows using list comprehensions.

l_2d_ok = [[0] * 4 for i in range(3)]
print(l_2d_ok)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Each inner list is treated as a different object.

l_2d_ok[0][0] = 100
print(l_2d_ok)
# [[100, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

print(id(l_2d_ok[0]) == id(l_2d_ok[1]) == id(l_2d_ok[2]))
# False

Although range() is used in the above example, any iterable of a desired size is acceptable.

l_2d_ok_2 = [[0] * 4 for i in [1] * 3]
print(l_2d_ok_2)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

l_2d_ok_2[0][0] = 100
print(l_2d_ok_2)
# [[100, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

print(id(l_2d_ok_2[0]) == id(l_2d_ok_2[1]) == id(l_2d_ok_2[2]))
# False

If you want to generate a multidimensional list, you can nest list comprehensions.

l_3d = [[[0] * 2 for i in range(3)] for j in range(4)]
print(l_3d)
# [[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]

l_3d[0][0][0] = 100
print(l_3d)
# [[[100, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]

For tuples and arrays

You can initialize tuples as well as lists.

Note that a tuple of one element requires ,.

t = (0,) * 5
print(t)
# (0, 0, 0, 0, 0)

For array type, you can pass the initialized list to the constructor.

import array

a = array.array('i', [0] * 5)
print(a)
# array('i', [0, 0, 0, 0, 0])
Sponsored Link
Share

Related Categories

Related Posts