In Python, data types such as lists, dictionaries, and matrices provide powerful ways to handle data efficiently. In this section, we will explore advanced-level implementations of List Comprehension, Nested Dictionaries, and Matrices to enhance your understanding and skills.
List comprehension is a concise way to generate lists, but it can also be used in more complex situations with nested comprehensions and multiple conditions.
Nested List Comprehension: You can use list comprehension within another list comprehension to create more complex structures.
Example:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [item for sublist in matrix for item in sublist]
print(flattened) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
List Comprehension with Multiple Conditions: You can apply multiple conditions to filter items in a list.
Example:
numbers = [x for x in range(20) if x % 2 == 0 and x % 3 == 0]
print(numbers) # Output: [0, 6, 12, 18]
Applying Functions with List Comprehension: You can apply functions to each element in the list during comprehension.
Example:
names = ['alice', 'bob', 'charlie']
capitalized = [name.capitalize() for name in names]
print(capitalized) # Output: ['Alice', 'Bob', 'Charlie']
Nested dictionaries are useful when dealing with hierarchical data. In this section, we explore more advanced uses of nested dictionaries, including deep access and manipulation.
Accessing Deeply Nested Values: You can access deeply nested values using multiple keys or with functions.
Example:
nested_dict = {
"company": {
"employee": {
"name": "John",
"position": "Manager"
}
}
}
print(nested_dict["company"]["employee"]["name"]) # Output: John
Modifying Nested Dictionaries: You can add or modify values in deeply nested dictionaries.
Example:
nested_dict["company"]["employee"]["salary"] = 50000
print(nested_dict["company"]["employee"]["salary"]) # Output: 50000
Iterating Through Nested Dictionaries: You can iterate through nested dictionaries using recursive functions.
Example:
def recursive_iter(dictionary):
for key, value in dictionary.items():
if isinstance(value, dict):
print(f"Entering {key}:")
recursive_iter(value)
else:
print(f"{key}: {value}")
recursive_iter(nested_dict)
Merging Nested Dictionaries: Merging two nested dictionaries while preserving the hierarchy.
Example:
dict1 = {"a": {"x": 1, "y": 2}, "b": 2}
dict2 = {"a": {"z": 3}, "b": 3}
from collections import ChainMap
merged = dict(ChainMap(dict1["a"], dict2["a"]))
print(merged) # Output: {'x': 1, 'y': 2, 'z': 3}
Matrices are often used for representing mathematical data. We will explore advanced matrix manipulations such as matrix transposition, multiplication, and more.
Matrix Transposition: Transposing a matrix involves flipping it over its diagonal, switching the row and column indices.
Example:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)
# Output: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Matrix Multiplication: Matrix multiplication involves multiplying two matrices together by performing row-by-column dot products.
Example:
matrix_a = [
[1, 2],
[3, 4]
]
matrix_b = [
[5, 6],
[7, 8]
]
result = [
[sum(a*b for a, b in zip(row_a, col_b)) for col_b in zip(*matrix_b)]
for row_a in matrix_a
]
print(result) # Output: [[19, 22], [43, 50]]
Matrix Determinant: Computing the determinant of a 2x2 matrix is useful in linear algebra for solving systems of equations.
Example:
def determinant(matrix):
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
matrix_2x2 = [[1, 2], [3, 4]]
print(determinant(matrix_2x2)) # Output: -2
Matrix Flattening: Flatten a matrix into a single list of elements.
Example:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
flattened = [item for sublist in matrix for item in sublist]
print(flattened) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Objective: Practice implementing and manipulating advanced data types in Python, including list comprehensions, nested dictionaries, and matrix operations.
List Comprehension:
even_squares = [x**2 for x in range(101) if x % 2 == 0]
print(even_squares)
three_d_list = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
flat_list = [item for sublist1 in three_d_list for sublist2 in sublist1 for item in sublist2]
print(flat_list)
Nested Dictionaries:
books = {
"book1": {"title": "1984", "author": "George Orwell", "year": 1949},
"book2": {"title": "To Kill a Mockingbird", "author": "Harper Lee", "year": 1960},
"book3": {"title": "The Great Gatsby", "author": "F. Scott Fitzgerald", "year": 1925}
}
print(books)
books["book1"]["genre"] = "Dystopian"
books["book2"]["genre"] = "Fiction"
books["book3"]["genre"] = "Classic"
print(books)
Matrix Operations:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed_matrix = [[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))]
print(transposed_matrix)
matrix1 = [[1, 2], [3, 4]]
matrix2 = [[5, 6], [7, 8]]
result_matrix = [[sum(a * b for a, b in zip(row, col)) for col in zip(*matrix2)] for row in matrix1]
print(result_matrix)