Cấu trúc dữ liệu List và Tuple trong Python

Bài viết được sự cho phép của tác giả Kien Dang Chung

Video trong bài viết

Chúng ta đã được giới thiệu các kiểu dữ liệu cơ bản trong Python bao gồm kiểu số nguyên (int), kiểu số thực (float), kiểu chuỗi (string) và kiểu logic (boolean). Với các kiểu dữ liệu cơ bản này, bạn hoàn toàn có thể viết các ứng dụng đơn giản với Python. Với các ứng dụng có số lượng các biến nhiều, dữ liệu lớn chúng ta cần tới các cấu trúc dữ liệu giúp cho việc viết code ngắn gọn và hiệu quả.

1. Tại sao cấu trúc dữ liệu cần thiết

Cấu trúc dữ liệu được sử dụng trong các chương trình để dễ dàng hơn trong việc định vị thông tin và lấy thông tin. Cấu trúc dữ liệu là cách các ngôn ngữ lập trình thể hiện các giá trị cơ bản, chúng chứa các kiểu dữ liệu cơ bản như số, chuỗi, boolean…, nó đưa ra cách thức lưu trữ nhiều giá trị trong một biến số. Cấu trúc dữ liệu cũng được sử dụng để phân nhóm và tổ chức cho các cấu trúc khác.

Để làm rõ hơn sự cần thiết các cấu trúc dữ liệu cơ bản, chúng ta có một ví dụ như sau:

friend1 = "Rolf"
friend2 = "Bob"
friend3 = "Anne"

print(friend1)
print(friend2)
print(friend3)

Một chương trình rất đơn giản với 3 biến chứa tên 3 người bạn, chúng ta in ra tên 3 người này. Tưởng tượng khi số lượng bạn gia tăng, bạn phải thêm vào hàng trăm biến và hàng trăm câu lệnh in ra màn hình. Quả là một thảm họa. Các cấu trúc dữ liệu cơ bản xuất hiện giúp bạn giải quyết vấn đề này.

  Kiểu dữ liệu Boolean và các toán tử AND OR NOT trong Python

2. Cấu trúc dữ liệu List

2.1 Định nghĩa và cách sử dụng List

List là một tập dữ liệu đơn giản nhất trong Python, một List là một danh sách các thành phần dữ liệu được phân cách bởi dấu phẩy và được bao ngoài bởi dấu ngoặc vuông. Tên của list được gán bằng cách sử dụng dấu =. List có thể chứa các con số hoặc các chuỗi.

friends = ["Rolf","Bob","Anne"]
ages = [35,28,37]

Để hiển thị nội dung List chúng ta có thể dùng hàm print(). List này có thể rất dài, bạn thấy đấy, chương trình ở phần trên với 3 biến có thể viết ngắn gọn hơn.

Chú ý, một danh sách có thể chứa nhiều loại dữ liệu khác nhau nếu bạn thấy cần thiết, tuy nhiên khuyến cáo nên dừng một loại dữ liệu thống nhất cho các phần tử trong danh sách.

friends = ["Rolf",2,"Anne"]

Định nghĩa danh sách này có cả số 2 bên trong danh sách friends, nó rất tối nghĩa, không có người bạn nào tên là 2 cả.

  Người dùng nhập liệu với hàm input() trong Python

2.2 Truy xuất phần tử trong List

Mỗi phần tử trong List sẽ có một vị trí nhất định tương ứng với một con số, bắt đầu từ số 0 và tăng dần. Chúng ta có thể truy xuất đến các phần tử trong danh sách với cú pháp:

list_name[element_position]

Trong ví dụ trên, để truy xuất đến tên Bob, chúng ta thực hiện như sau:

friends = ["Rolf","Bob","Anne"]
print(friends[1])

Chú ý, nếu bạn truy xuất đến một phần tử không có trong danh sách, một lỗi sẽ xuất hiện có dạng “index out of range”. Ví dụ như các phần tử trong danh sách friends có vị trí tương ứng là 0, 1, 2. Nếu bạn truy xuất đến phần tử có vị trí lớn hơn 2 sẽ gặp lỗi “index out of range”.

2.3 Danh sách đa chiều

Mỗi phần tử trong danh sách của Python có thể là một danh sách, ví dụ như danh sách sau đây, mỗi phần tử là một danh sách gồm tên và tuổi của bạn bè.

friends = [["Rolf", 24], ["Bob", 30], ["Anne", 27]]
print(friends[0][1])  # 24
print(friends[1][0])  # Bob

Trong Python không giới hạn số chiều của danh sách cũng như số phần tử danh sách có thể chứa, nó chỉ phụ thuộc vào dung lượng bộ nhớ máy tính bạn dùng để chạy ứng dụng.

Chú ý, với các danh sách dài, chúng ta nên trình bày mỗi phần tử trên một dòng, như vậy code chương trình sẽ dễ đọc hơn, ví dụ:

friends = [
    ["Rolf", 24],
    ["Bob", 30],
    ["Anne", 27],
    ["Charlie", 37],
    ["Jen", 25],
    ["Adam", 29],
]

Xem thêm các cơ hội tuyển dụng Python Hà Nội hấp dẫn trên TopDev

2.4 Một số hàm liên quan đến danh sách

Trong quá trình thao tác với danh sách, bạn sẽ gặp phải một số yêu cầu kiểu như: kiểm tra xem danh sách có chứa một phần tử nào đó không? đếm số phần tử trong danh sách? hoặc các thao tác thêm bớt điều chỉnh phần tử trong danh sách… Các yêu cầu này đều có toán tử hoặc các phương thức được xây dựng sẵn trong đối tượng List.

2.3.1 Toán tử in

Toán tử in cho phép bạn kiểm tra một phần tử có nằm trong một danh sách hay không. Ví dụ: Kiểm tra xem “Anne” có trong danh sách friends không?

friends = ["Rolf","Bob","Anne"]
has_anne = "Anne" in friends
print(has_anne) #Kết quả là True

2.3.2 Hàm len()

Hàm len() trả về số phần tử có trong một danh sách. Chú ý rằng trong Python các phần tử bắt đầu từ vị trí 0, do đó phần tử cuối cùng sẽ có vị trí là len() – 1.

friends = ["Rolf","Bob","Anne"]

print(f"Danh sách bạn bè có {len(friends)} bạn") #Kết quả là 3

2.3.3 Một số phương thức trên Model List

.append() thêm một phần tử vào vị trí cuối cùng trong danh sách:

friends = ["Rolf","Bob","Anne"]
friends.append("Jen")
new_friend = "Charlie"
friends.append(new_friend)
print(friends) #Kết quả là ["Rolf","Bob","Anne","Jen","Charlie"]

.insert(position, item) chèn một phần tử vào danh sách tại vị trí position cho trước.

friends = ["Rolf","Bob","Anne"]
friends.insert(1,"Jen")
print(friends) #Kết quả là ["Rolf","Jen","Bob","Anne"]

Các phần tử phía sau sẽ có vị trí tăng lên 1, bạn cần chú ý khi truy xuất giá trị các phần tử này.

listname[index]=newvalue Thay đổi giá trị một phần tử có vị trí index trong danh sách.

friends = ["Rolf","Bob","Anne"]
friends[1] = "Jen"
print(friends) #Kết quả là ["Rolf","Jen","Anne"]

.extend() Kết hợp danh sách với một danh sách khác.

friends = ["Rolf","Bob","Anne"]
old_friends = ["Jen","Charlie"]
friends.extend(old_friends)
print(friends) #Kết quả là ["Rolf","Bob","Anne","Jen","Charlie"]

.remove() Loại bỏ một phần tử khỏi danh sách.

friends = ["Rolf","Bob","Anne"]
friends.remove("Bob")
print(friends) #Kết quả là ["Rolf","Anne"]

.pop(index) Loại bỏ phần tử ở vị trí index cho trước trong danh sách.

friends = ["Rolf","Bob","Anne"]
friends.pop(1)
print(friends) #Kết quả là ["Rolf","Anne"]

del Xóa một phần tử hoặc toàn bộ danh sách

friends = ["Rolf","Bob","Anne"]
del friends[1]
print(friends) #Kết quả là ["Rolf","Anne"]
del friends
print(friends) #Lỗi name 'friends' is not defined

.clear() Xóa sạch các phần tử trong danh sách

friends = ["Rolf","Bob","Anne"]
friends.clear()
print(friends) #Kết quả là []

Chú ý, .clear() khác với del, .clear() xóa toàn bộ các phần tử trong danh sách, còn del xóa luôn cả biến danh sách.

.count() Đếm số lần một phần tử xuất hiện trong danh sách.

friends = ["Rolf","Bob","Anne","Bob"]

print(f"Có {friends.count('Bob')} người tên Bob trong danh sách bạn bè") #Kết quả là 2

.index() Trả về vị trí phần tử trong danh sách

friends = ["Rolf","Bob","Anne"]

print(f"Anne ở vị trí thứ {friends.index('Anne')} trong danh sách") #Kết quả là 2

.sort() sắp xếp các phần tử trong danh sách.

friends = ["Rolf","Bob","Anne"]
friends.sort()
print(friends) #Kết quả là ["Anne","Bob","Rolf"]

Mặc định sắp xếp này là tăng dần với dữ liệu chuỗi sẽ sắp xếp a-z, A-Z, với số 0-9. Để sắp xếp giảm dần sử dụng tham số reverse = True.

reverse() Đảo ngược thứ tự các phần tử trong danh sách.

friends = ["Rolf","Bob","Anne"]
friends.reverse()
print(friends) #Kết quả là ["Anne","Bob","Rolf"]

.copy() Copy toàn bộ danh sách.

friends = ["Rolf","Bob","Anne"]
news_friends = friends.copy()
news_friends.append("Jen")
print(news_friends) #Kết quả là ["Anne","Bob","Rolf","Jen"]

Xem thêm các cơ hội tuyển dụng Python hấp dẫn trên TopDev

3. Cấu trúc dữ liệu Tuple

Python hỗ trợ một cấu trúc dữ liệu cũng tương tự với List có tên là Tuple, chỉ có một khác biệt Tuple là danh sách bất biến, không thể thay đổi nội dung. Tức là ngay sau khi định nghĩa Tuple, bạn không thể thay đổi nó. Vậy tại sao có cấu trúc này và Tuple dùng trong những trường hợp nào? Câu trả lời sẽ có ở cuối bài viết này.

3.1 Khai báo Tuple

Định nghĩa một Tuple cũng giống như định nghĩa một List trong Python, chỉ khác một điều là thay vì sử dụng ngoặc vuông chúng ta sử dụng ngoặc thường ở đây.

friends = ("Rolf","Bob","Anne")

Chú ý, Python cho phép định nghĩa Tuple mà không cần sử dụng dấu ngoặc thường. Ví dụ:

friends = "Rolf","Bob","Anne"

Đây là một định nghĩa Tuple, thậm chí Tuple chỉ có một phần tử:

friends = "Rolf",

Chú ý dấu phẩy, nếu không có dấu phẩy thì đây là định nghĩa một chuỗi.

3.2 Thao tác với Tuple

Tuple là một danh sách đặc biệt, không thể thay đổi khi đã tạo ra, do đó bạn có thể sử dụng tất cả các kỹ thuật, các hàm như với List nhưng loại trừ những hàm tác động thay đổi nội dung.

Ví dụ, bạn có thể sử dụng toán tử in, hàm len() với Tuple:

friends = ("Rolf","Bob","Anne")
has_anne = "Annnnnne" in friends
print(has_anne) #Kết quả là Flase

hoặc

friends = ("Rolf","Bob","Anne")

print(f"Danh sách bạn bè có {len(friends)} bạn") #Kết quả là 3

Tất cả các phương thức .append(), .extend(), .clear(), .copy(), .insert(), .pop(), .remove(), .reverse(), .sort() không sử dụng được với cấu trúc dữ liệu Tuple.

Chú ý, bạn không thể thay đổi Tuple nhưng có thể tạo ra một Tuple từ hai Tuple, xem ví dụ sau:

friends = ("Rolf","Bob","Anne")
friends = friends + ("Jen",)

print(friends) #Kết quả là ("Rolf","Bob","Anne","Jen")

3.3 Tại sao sử dụng Tuple

Tuple có những hạn chế là khi tạo ra không thể thay đổi được tuy nhiên Tuple lại có những ưu điểm như sau:

  • Tuple có tốc độ xử lý nhanh hơn List, do Tuple được lưu trữ một khối bộ nhớ xác định còn List thì thường xuyên phải thay đổi không gian lưu trữ. Nếu bạn định nghĩa một tập các giá trị là hằng số và sau đó duyệt qua tập hợp này thì nên chọn Tuple.
  • Sử dụng Tuple giúp code an toàn hơn, khi đó chế độ “write-protect” giúp cho dữ liệu không thể thay đổi. Do vậy nên lựa chọn cho những dữ liệu dạng hằng số, dữ liệu không thay đổi theo thời gian.
  • Tuple còn được sử dụng làm khóa trong Dictionary do nó chứa các giá trị không đổi, List không được sử dụng làm khóa cho Dictionary.

Bài viết gốc được đăng tải tại allaravel.com

Xem thêm việc làm IT hấp dẫn trên TopDev