C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Step 1: We first create an empty list with the empty square brackets. Then we call the append method and add 2 empty lists.
ListStep 2: We access each sub-list and call append on it. This appends to the inner lists.
Step 3: We display the element at indexes 0, 0 and this value is 1. With the print() method we can display the entire list contents.
Step 4: This loop can iterate rows and columns in the 2D list. Nested for-loops loop over rows and columns.
forPython program that uses 2D list
# 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")
Output
1
[[1, 2], [3, 4]]
12
34
Info: This is a list of lists, not exactly a 2D list. It does not need to be rectangular—some lists can be longer than others.
Tip: All the methods on list, including "len" and "in," work on nested lists. But they consider only one sub-list at a time.
LenCaution: For performance, nested lists are not optimal. An array is faster than a list.
ArrayPython program that uses jagged lists
# 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)
Output
2 [10, 20]
5 [30, 40, 50, 60, 70]
Index: The multiplication of the coordinates returns a single integer for a 2D point.
Here: We define get_element and set_element methods. We compute indexes based on an "x" and "y" coordinate pair.
Python program that uses flattened list
def get_element(elements, x, y):
# Get element with two coordinates.
return elements[x + (y * 10)]
def set_element(elements, x, y, value):
# Set element with two coordinates.
elements[x + (y * 10)] = value
# Create a list of 100 elements.
elements = []
for i in range(0, 100):
elements.append(0)
i = 0
for x in range(0, 10):
for y in range(0, 10):
# Set each element in the list to an incremented number.
set_element(elements, x, y, i)
i += 1
# First in first row.
print(get_element(elements, 0, 0))
# Last in first row.
print(get_element(elements, 0, 9))
# First in last row.
print(get_element(elements, 9, 0))
# Last in last row.
print(get_element(elements, 9, 9))
Output
0
9
90
99
Version 1: This version of the code accesses an element in a nested list—so it accesses 2 elements total.
Version 2: This code accesses the flattened list, using an expression to compute the correct index.
Result: Accessing the element at position coordinates 1, 2 is slightly faster in the flattened list.
Python program that times nested, flattened list
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())
Output
60
60
1420077374.795
1420077375.334: Nested list, 0.539 s
1420077375.794: Flat list, 0.460 s [PyPy]