Bổ sung Think Python: Ma trận

Trở về Mục lục cuốn sách

Phần bổ sung này lấy từ các chương 8 và 10 của cuốn How to think like a computer scientist

Danh sách lồng ghép

Danh sách lồng ghép là một danh sách xuất hiện với vai trò một phần tử trong một danh sách khác. Trong danh sách sau đây, phần tử thứ ba của nó là danh sách lồng ghép:

>>> list = ["hello", 2.0, 5, [10, 20]]

Nếu in ra list[3], ta được [10, 20]. Để kết xuất một phần tử của danh sách lồng ghép, ta có thể tiến hành theo hai bước:

>>> elt = list[3]
>>> elt[0]
10

Hoặc cũng có thể kết hợp hai bước này lại:

>>> list[3][1]
20

Toán tử ngoặc vuông lượng giá từ trái sang phải, vì vậy biểu thức này nhận phần tử thứ ba của list rồi kết xuất phần tử đầu trong đó.

Ma trận

Danh sách lồng ghép thường được dùng để biểu diễn ma trận. Chẳng hạn, ma trận:

có thể được biểu diễn bởi:

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

matrix là một danh sách gồm ba phần tử, trong đó mỗi phần tử là một hàng của ma trận. Ta có thể chọn cả một hàng của ma trận theo cách thông thường:

>>> matrix[1]
[4, 5, 6]

Hoặc ta cũng có thể kết xuất một phần tử từ ma trận bằng dạng chỉ số kép:

>>> matrix[1][1]
5

Chỉ số thứ nhất để chọn hàng, còn chỉ số thứ hai chọn cột. Mặc dù đây là cách biểu diễn ma trận thông dụng, song cũng không phải là cách duy nhất. Một phương án khác chút xíu là dùng một danh sách các cột thay vì danh sách các hàng. Sau đây ta sẽ thấy một cách khác hẳn có dùng đến từ điển.

Ma trận thưa

Ở trên, ta đã dùng danh sách để biểu diễn một ma trận. Đó là lựa chọn hợp lý đối với ma trận chứa phần lớn các số khác không, nhưng hãy xét một ma trận thưa như sau:

Danh sách biểu diễn cho nó sẽ chứa rất nhiều số không:

matrix = [ [0,0,0,1,0],
[0,0,0,0,0],
[0,2,0,0,0],
[0,0,0,0,0],
[0,0,0,3,0] ]

Một cách khác là dùng từ điển. Để chọn làm khóa, ta có thể lấy những bộ tạo bởi thứ tự hàng và thứ tự cột. Sau đây là cách biểu diễn từ điển cũng của ma trận trên:

matrix = {(0,3): 1, (2, 1): 2, (4, 3): 3}

Ta chỉ cần ba cặp khóa-trị, mỗi cặp cho một phần tử khác không của ma trận. Từng khóa đều là bộ, và từng giá trị là số nguyên.

Để truy cập một phần tử của ma trạn, ta có thể dùng toán tử []:

matrix[0,3]
1

Lưu ý rằng cú pháp của cách biểu diễn từ điển thì không giống cú pháp biểu diễn danh sách lồng ghép. Thay vì hai chỉ số nguyên, ta dùng một chỉ số, đó là một bộ các số nguyên.

Có một vấn đề nảy sinh. Nếu ta chỉ đến một phần tử bằng không, sẽ có lỗi, vì không có phần tử nào trong từ điển ứng với khóa đó:

>>> matrix[1,3]
KeyError: (1, 3)

Phương thức get sẽ giải quyết được vấn đề này:

>>> matrix.get((0,3), 0)
1

Đối số thứ nhất là khóa; đối số thứ hai là giá trị mà get cần phải trả lại nếu khóa không nằm trong từ điển:

>>> matrix.get((1,3), 0)
0

Rõ ràng là get đã cải thiện khả năng truy cập ma trận thưa. Nhưng cú pháp thì trông thật xấu.

1 Phản hồi

Filed under Think Python

One response to “Bổ sung Think Python: Ma trận

  1. Pingback: Cách nghĩ như nhà khoa học máy tính | Blog của Chiến

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s