Programs often must model 2 dimensions, not just one. In a Python list we can place other lists: this creates a 2D representation of objects.
We can access elements on each list with an index—we must specify the X and Y positions. To construct a 2D list, we can use append()
or an initializer.
We create an empty list and add empty lists to it with append()
. We can construct any rectangular (or jagged) list this way. In this example we build a 2 by 2 list.
print()
method we can display the entire list contents.for
-loops loop over rows and columns.# Step 1: create a list. # ... Append empty lists in first two indexes. elements = [] elements.append([]) elements.append([]) # Step 2: add elements to empty lists. elements[0].append(1) elements[0].append(2) elements[1].append(3) elements[1].append(4) # Step 3: display top-left element. # ... Display entire list. print(elements[0][0]) print(elements) # Step 4: loop over rows. for row in elements: # Loop over columns. for column in row: print(column, end="") print(end="\n")1 [[1, 2], [3, 4]] 12 34
The term "jagged" implies that sub lists have uneven lengths. Here we create a list of 2 lists—one of length 2, the other of length 5. We display their lengths.
len
" and "in," work on nested lists. But they consider only one sub-list at a time.# A jagged list.
values = [[10, 20], [30, 40, 50, 60, 70]]
for value in values:
# Print each row's length and its elements.
print(len(value), value)2 [10, 20]
5 [30, 40, 50, 60, 70]
It is possible to index into a 1D array as though it is two-dimensional. We add the first coordinate, "x," and then multiply the second "y" coordinate by the length.
get_element
and set_element
methods. We compute indexes based on an "x" and "y" coordinate pair.def get_element(elements, x, y): return elements[x + (y * 4)] def set_element(elements, x, y, value): elements[x + (y * 4)] = value # Create a list of 16 elements. elements = [] for i in range(0, 16): elements.append(0) i = 0 for x in range(0, 4): for y in range(0, 4): # Set each element in the flattened list. set_element(elements, x, y, i) i += 1 # Print some elements. print(get_element(elements, 0, 0)) print(get_element(elements, 1, 1)) print(get_element(elements, 3, 3))0 5 15
Suppose it is simple to change a nested list to a flattened, 1D list. This will likely result in a performance increase.
import time # Nested, 3x2. nested_list = [] nested_list.append([10, 20, 30]) nested_list.append([40, 50, 60]) # Flattened, 3x2. flat_list = [10, 20, 30, 40, 50, 60] # Test the two lists. print(nested_list[1][2]) print(flat_list[1 + (2 * 2)]) print(time.time()) # Version 1: access element in nested list. for i in range(0, 100000000): if nested_list[1][2] != 60: print(False) print(time.time()) # Version 2: access element in flattened list. for i in range(0, 100000000): if flat_list[1 + (2 * 2)] != 60: print(False) print(time.time())60 60 1420077374.795 1420077375.334: Nested list, 0.539 s 1420077375.794: Flat list, 0.460 s [PyPy]
Python supports a special "array" from the array module. An integer array is more compact in memory than an integer list. We can create a flattened 2D array.
Sometimes a 2D list is helpful in programs. For a simple or small coordinate system or grid, nested lists can be useful. They are flexible. The syntax is clear.
For larger or more complex requirements, this approach is not ideal. Another data structure, like an array, is a better choice at this scale.