List, Tuple và Dictionary trong Python

List, Tuple và Dictionary trong Python

Trong bài này chúng ta sẽ cùng tìm hiểu 3 kiểu dữ liệu tập hợp được dùng nhiều nhất: List, Tuple và Dictionary trong Python. Đây là những thứ các bạn sẽ dùng hằng ngày, từ lưu danh sách nhiệt độ đọc từ cảm biến, cấu hình cổng UART cho tới đóng gói một gói dữ liệu gửi lên server.

Bài 11 trong Serie Lập trình Python từ A tới Z

List, Tuple và Dictionary trong Python

Tại sao cần List, Tuple và Dictionary?

Ở bài Khai báo biến và hằng trong Python, mỗi biến chỉ chứa một giá trị. Nhưng thử tưởng tượng bạn đọc nhiệt độ mỗi giây trong 1 tiếng, chẳng lẽ lại khai báo 3600 biến t1, t2, t3…?

Lúc này chúng ta cần một kiểu dữ liệu chứa được nhiều giá trị cùng lúc. Python có sẵn 3 kiểu hay dùng nhất:

  • List (danh sách): giống mảng trong C nhưng thêm bớt phần tử thoải mái.
  • Tuple (bộ): giống List nhưng tạo ra rồi thì không sửa được.
  • Dictionary (từ điển): lưu dữ liệu theo cặp tên và giá trị (key – value).

Ví dụ đời thường cho dễ nhớ nhé. List giống tờ giấy ghi danh sách đi chợ, mua thêm gì thì ghi thêm, mua rồi thì gạch đi. Tuple giống số chứng minh nhân dân, in ra rồi là cố định. Dictionary giống danh bạ điện thoại, tra theo tên là ra số.

List trong Python

Khai báo và truy cập List

List được khai báo bằng cặp ngoặc vuông [], các phần tử cách nhau bằng dấu phẩy. Chỉ số (index) bắt đầu từ 0 giống C.

# Danh sách nhiệt độ đọc được từ cảm biến
temps = [28.5, 29.1, 30.4, 29.8]
print("List ban đầu:", temps)

print("Phần tử đầu:", temps[0])
print("Phần tử cuối:", temps[-1])
print("3 phần tử đầu:", temps[0:3])

Python cho phép dùng chỉ số âm: temps[-1] là phần tử cuối cùng, temps[-2] là phần tử áp chót. Còn temps[0:3] là cắt lát (slicing), lấy từ vị trí 0 tới trước vị trí 3.

Thêm, xóa phần tử

Đây là điểm khác lớn nhất so với mảng trong C: List tự co giãn, không phải khai báo kích thước trước.

temps.append(31.2)          # thêm vào cuối
temps.insert(0, 27.9)       # chèn vào vị trí 0
print("Sau khi thêm:", temps)

temps.remove(30.4)          # xóa theo giá trị
last = temps.pop()          # lấy ra và xóa phần tử cuối
print("Vừa pop:", last, "-> còn lại:", temps)

Một số hàm hay dùng với List:

  • len(list): số phần tử.
  • max(list), min(list): giá trị lớn nhất, nhỏ nhất.
  • sum(list): tổng các phần tử.
  • list.sort(): sắp xếp tăng dần ngay trên List đó.
print("Số phần tử:", len(temps))
print("Lớn nhất:", max(temps), "Nhỏ nhất:", min(temps))
print("Trung bình:", round(sum(temps) / len(temps), 2))

Tính trung bình nhiệt độ chỉ mất một dòng, trong C thì phải viết hẳn một vòng for đúng không nào.

Duyệt List và List comprehension

Duyệt List bằng vòng lặp for như đã học ở bài Vòng lặp trong Python. Nếu cần cả chỉ số lẫn giá trị thì dùng enumerate().

for i, t in enumerate(temps):
    print(f"  Lần đo {i}: {t} độ C")

# List comprehension: lọc các giá trị trên 29 độ
hot = [t for t in temps if t > 29]
print("Các lần đo trên 29 độ:", hot)

Dòng cuối gọi là list comprehension: tạo một List mới từ List cũ trong đúng một dòng. Đọc nó như câu tiếng Anh: “lấy t, với mỗi t trong temps, nếu t lớn hơn 29”.

Lưu ý: Gán b = a với List không tạo ra List mới, mà chỉ là thêm một cái tên trỏ tới cùng List đó. Sửa b thì a cũng bị sửa theo. Muốn tạo bản sao độc lập thì dùng b = a.copy().

Tuple trong Python

Tuple khai báo bằng cặp ngoặc tròn (). Truy cập phần tử giống hệt List, nhưng không thể thêm, xóa hay sửa phần tử sau khi tạo.

Vậy tại sao lại cần một thứ “kém” hơn List? Chính vì không sửa được nên Tuple rất hợp với dữ liệu cố định như cấu hình, tọa độ, màu RGB. Lỡ tay gán nhầm ở đâu đó trong code thì Python báo lỗi ngay, không để sai âm thầm.

# Cấu hình UART không được phép thay đổi
uart_config = ("COM3", 115200, 8, "N", 1)
print("Tuple:", uart_config)
print("Baudrate:", uart_config[1])

port, baud, databits, parity, stopbits = uart_config   # unpack
print(f"Cổng {port}, {baud} baud, {databits}{parity}{stopbits}")

try:
    uart_config[1] = 9600
except TypeError as e:
    print("Không sửa được tuple:", e)

Dòng port, baud, ... = uart_config gọi là unpack: tách từng phần tử của Tuple ra các biến riêng. Cách này dùng rất nhiều khi hàm trả về nhiều giá trị cùng lúc.

Phần try / except ở cuối dùng để bắt lỗi khi cố sửa Tuple, mình sẽ giải thích kỹ ở bài 13 nhé.

Lưu ý: Tuple chỉ có 1 phần tử phải có dấu phẩy ở cuối, ví dụ (5,). Nếu viết (5) thì Python hiểu đó chỉ là số 5 nằm trong ngoặc, không phải Tuple.

Dictionary trong Python

Dictionary khai báo bằng cặp ngoặc nhọn {}, mỗi phần tử là một cặp key: value. Thay vì truy cập bằng số thứ tự, chúng ta truy cập bằng tên key.

Ví dụ đóng gói thông tin của một cảm biến:

sensor = {
    "name": "DHT11",
    "pin": 4,
    "temp": 29.5,
    "humi": 65,
}
print("Dictionary:", sensor)
print("Tên cảm biến:", sensor["name"])

sensor["temp"] = 30.1        # sửa giá trị
sensor["unit"] = "C"         # thêm key mới
del sensor["pin"]            # xóa key
print("Sau khi sửa:", sensor)

So với List, đọc sensor["temp"] dễ hiểu hơn sensor[2] rất nhiều. Sau này làm IoT, dữ liệu JSON gửi lên server cũng có cấu trúc giống hệt Dictionary.

Kiểm tra key và duyệt Dictionary:

print("Có key 'humi' không?", "humi" in sensor)
print("Key 'pressure':", sensor.get("pressure", "không có"))

for key, value in sensor.items():
    print(f"  {key} = {value}")

Lưu ý: Truy cập key không tồn tại bằng sensor["pressure"] sẽ báo lỗi KeyError và dừng chương trình. Khi không chắc key có hay không, dùng sensor.get("pressure", giá_trị_mặc_định) để lấy giá trị an toàn.

So sánh List, Tuple và Dictionary

Tiêu chí List Tuple Dictionary
Ký hiệu [ ] ( ) { }
Truy cập Theo chỉ số Theo chỉ số Theo key
Sửa được không Có Không Có
Dùng khi Dữ liệu thay đổi liên tục Dữ liệu cố định Dữ liệu có tên gọi

Kết quả

Toàn bộ code trong bài nằm trong file main.py trên GitHub. Chạy bằng lệnh python main.py sẽ được kết quả:

List ban đầu: [28.5, 29.1, 30.4, 29.8]
Sau khi thêm: [27.9, 28.5, 29.1, 30.4, 29.8, 31.2]
Phần tử đầu: 27.9
Phần tử cuối: 31.2
3 phần tử đầu: [27.9, 28.5, 29.1]
Vừa pop: 31.2 -> còn lại: [27.9, 28.5, 29.1, 29.8]
Số phần tử: 4
Lớn nhất: 29.8 Nhỏ nhất: 27.9
Trung bình: 28.82
  Lần đo 0: 27.9 độ C
  Lần đo 1: 28.5 độ C
  Lần đo 2: 29.1 độ C
  Lần đo 3: 29.8 độ C
Các lần đo trên 29 độ: [29.1, 29.8]

Tuple: ('COM3', 115200, 8, 'N', 1)
Baudrate: 115200
Cổng COM3, 115200 baud, 8N1
Không sửa được tuple: 'tuple' object does not support item assignment

Dictionary: {'name': 'DHT11', 'pin': 4, 'temp': 29.5, 'humi': 65}
Tên cảm biến: DHT11
Sau khi sửa: {'name': 'DHT11', 'temp': 30.1, 'humi': 65, 'unit': 'C'}
Có key 'humi' không? True
Key 'pressure': không có
  name = DHT11
  temp = 30.1
  humi = 65
  unit = C

Kết

List, Tuple và Dictionary là 3 kiểu dữ liệu các bạn sẽ gặp ở gần như mọi chương trình Python. Mẹo chọn nhanh: dữ liệu thay đổi thì dùng List, cố định thì dùng Tuple, có tên gọi thì dùng Dictionary.

Ở bài tiếp theo chúng ta sẽ học cách tự tạo kiểu dữ liệu riêng bằng Class. Nếu thấy bài viết có ích, hãy chia sẻ cho bạn bè cùng học nhé!

Rate this post

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *