So sánh List, Tuple, Dictionary, Set
1. Tổng quan về 4 kiểu dữ liệu
Phần tiêu đề “1. Tổng quan về 4 kiểu dữ liệu”Python cung cấp 4 kiểu dữ liệu tập hợp (Collection) chính:
| Kiểu dữ liệu | Ký hiệu | Có thứ tự | Có thể thay đổi | Cho phép trùng lặp |
|---|---|---|---|---|
| List | [] |
✅ Có | ✅ Có | ✅ Có |
| Tuple | () |
✅ Có | ❌ Không | ✅ Có |
| Dictionary | {} |
✅ Có (3.7+) | ✅ Có | Key: Không, Value: Có |
| Set | {} |
❌ Không | ✅ Có | ❌ Không |
# Ví dụ tạo 4 kiểu dữ liệumy_list = [1, 2, 3, 2, 1] # List - cho phép trùng lặpmy_tuple = (1, 2, 3, 2, 1) # Tuple - cho phép trùng lặpmy_dict = {"a": 1, "b": 2, "c": 3} # Dictionary - key-value pairsmy_set = {1, 2, 3} # Set - không trùng lặp2. So sánh chi tiết
Phần tiêu đề “2. So sánh chi tiết”2.1. Cách tạo
Phần tiêu đề “2.1. Cách tạo”# List - dùng ngoặc vuông []fruits_list = ["apple", "banana", "orange"]empty_list = []
# Tuple - dùng ngoặc tròn ()fruits_tuple = ("apple", "banana", "orange")single_tuple = (1,) # Cần dấu phẩy cho tuple 1 phần tửempty_tuple = ()
# Dictionary - dùng ngoặc nhọn {} với cặp key:valueperson = {"name": "Alice", "age": 25}empty_dict = {}
# Set - dùng ngoặc nhọn {} (không có key:value)numbers_set = {1, 2, 3, 4, 5}empty_set = set() # KHÔNG dùng {} vì đó là dict rỗng!2.2. Có thứ tự (Ordered)
Phần tiêu đề “2.2. Có thứ tự (Ordered)”# List - CÓ thứ tự, phần tử giữ nguyên vị trímy_list = ["a", "b", "c"]print(my_list[0]) # "a" - luôn là phần tử đầu tiên
# Tuple - CÓ thứ tự (giống List)my_tuple = ("a", "b", "c")print(my_tuple[1]) # "b" - luôn là phần tử thứ 2
# Dictionary - CÓ thứ tự (từ Python 3.7+)my_dict = {"first": 1, "second": 2, "third": 3}for key in my_dict: print(key) # Luôn in: first, second, third
# Set - KHÔNG có thứ tựmy_set = {3, 1, 2}print(my_set) # Có thể in: {1, 2, 3} hoặc thứ tự khác# KHÔNG thể truy cập bằng index: my_set[0] sẽ LỖI!2.3. Có thể thay đổi (Mutable)
Phần tiêu đề “2.3. Có thể thay đổi (Mutable)”# List - CÓ THỂ thay đổimy_list = [1, 2, 3]my_list[0] = 10 # Sửa: [10, 2, 3]my_list.append(4) # Thêm: [10, 2, 3, 4]my_list.remove(2) # Xoá: [10, 3, 4]
# Tuple - KHÔNG THỂ thay đổimy_tuple = (1, 2, 3)# my_tuple[0] = 10 # LỖI: TypeError# my_tuple.append(4) # LỖI: AttributeError# Muốn "thay đổi" phải tạo tuple mớimy_tuple = my_tuple + (4,) # (1, 2, 3, 4)
# Dictionary - CÓ THỂ thay đổimy_dict = {"a": 1}my_dict["a"] = 10 # Sửa value: {"a": 10}my_dict["b"] = 2 # Thêm: {"a": 10, "b": 2}del my_dict["a"] # Xoá: {"b": 2}
# Set - CÓ THỂ thay đổi (thêm/xoá, không sửa trực tiếp)my_set = {1, 2, 3}my_set.add(4) # Thêm: {1, 2, 3, 4}my_set.remove(1) # Xoá: {2, 3, 4}# KHÔNG thể sửa trực tiếp phần tử, phải xoá rồi thêm mới2.4. Cho phép trùng lặp (Duplicates)
Phần tiêu đề “2.4. Cho phép trùng lặp (Duplicates)”# List - CHO PHÉP trùng lặpmy_list = [1, 2, 2, 3, 3, 3]print(my_list) # [1, 2, 2, 3, 3, 3] - giữ nguyên
# Tuple - CHO PHÉP trùng lặpmy_tuple = (1, 2, 2, 3, 3, 3)print(my_tuple) # (1, 2, 2, 3, 3, 3) - giữ nguyên
# Dictionary - Key KHÔNG được trùng, Value có thể trùngmy_dict = {"a": 1, "b": 1, "a": 2} # Key "a" bị trùngprint(my_dict) # {"a": 2, "b": 1} - key sau ghi đè key trước
# Set - KHÔNG cho phép trùng lặpmy_set = {1, 2, 2, 3, 3, 3}print(my_set) # {1, 2, 3} - tự động loại bỏ trùng lặp3. Hiệu suất (Performance)
Phần tiêu đề “3. Hiệu suất (Performance)”| Thao tác | List | Tuple | Dictionary | Set |
|---|---|---|---|---|
| Truy cập theo index | O(1) | O(1) | ❌ | ❌ |
| Truy cập theo key | ❌ | ❌ | O(1) | ❌ |
Tìm kiếm (in) |
O(n) | O(n) | O(1) | O(1) |
| Thêm cuối | O(1) | ❌ | O(1) | O(1) |
| Xoá phần tử | O(n) | ❌ | O(1) | O(1) |
| Bộ nhớ sử dụng | Trung bình | Ít nhất | Nhiều nhất | Trung bình |
Kết luận:
- Dictionary và Set rất nhanh khi tìm kiếm hoặc kiểm tra phần tử
- Tuple tiết kiệm bộ nhớ nhất
- List linh hoạt nhất khi cần thay đổi
4. Khi nào dùng kiểu dữ liệu nào?
Phần tiêu đề “4. Khi nào dùng kiểu dữ liệu nào?”Dùng List khi:
Phần tiêu đề “Dùng List khi:”- Cần lưu trữ các phần tử có thứ tự và có thể trùng lặp
- Cần thay đổi (thêm, xoá, sửa) các phần tử thường xuyên
- Cần truy cập theo index
# Danh sách học sinh (có thể thay đổi, có thứ tự)students = ["Alice", "Bob", "Charlie"]students.append("David")
# Lịch sử hoạt động (có thứ tự, có thể trùng lặp)history = ["login", "view", "login", "logout"]Dùng Tuple khi:
Phần tiêu đề “Dùng Tuple khi:”- Dữ liệu không cần thay đổi (immutable)
- Cần hiệu suất tốt hơn và tiết kiệm bộ nhớ
- Cần dùng làm key trong Dictionary hoặc phần tử trong Set
# Toạ độ (không đổi)point = (10, 20)
# Thông tin cố địnhrgb_red = (255, 0, 0)date = (2025, 1, 15)
# Làm key cho dictionarylocations = { (10, 20): "Point A", (30, 40): "Point B"}Dùng Dictionary khi:
Phần tiêu đề “Dùng Dictionary khi:”- Cần lưu trữ dữ liệu dạng key-value
- Cần tra cứu nhanh theo key
- Cần lưu trữ thông tin có cấu trúc
# Thông tin người dùnguser = { "name": "Alice", "age": 25,}
# Đếm tần suấtword_count = {"hello": 5, "world": 3}
# Cấu hình ứng dụngconfig = { "debug": True, "port": 8080, "database": "mysql"}Dùng Set khi:
Phần tiêu đề “Dùng Set khi:”- Cần lưu trữ các phần tử duy nhất
- Cần thực hiện các phép toán tập hợp (hợp, giao, hiệu)
- Cần kiểm tra membership nhanh
# Loại bỏ trùng lặpnumbers = [1, 2, 3, 2, 1, 4, 3]unique = set(numbers) # {1, 2, 3, 4}
# Kiểm tra quyền truy cậpadmin_users = {"alice", "bob", "admin"}if username in admin_users: print("Granted")
# Tìm phần tử chungclass_a = {"Alice", "Bob", "Charlie"}class_b = {"Bob", "David", "Eve"}both = class_a & class_b # {"Bob"}5. Tóm tắt
Phần tiêu đề “5. Tóm tắt”| Tiêu chí | List | Tuple | Dictionary | Set |
|---|---|---|---|---|
| Có thứ tự | ✅ | ✅ | ✅ (3.7+) | ❌ |
| Có thể thay đổi | ✅ | ❌ | ✅ | ✅ |
| Cho phép trùng lặp | ✅ | ✅ | Key: ❌ | ❌ |
| Truy cập index | ✅ | ✅ | ❌ | ❌ |
| Truy cập key | ❌ | ❌ | ✅ | ❌ |
| Tìm kiếm nhanh | ❌ | ❌ | ✅ | ✅ |
| Làm key Dict | ❌ | ✅ | ❌ | ❌ |
| Tiết kiệm bộ nhớ | 🔸 | ✅ | ❌ | 🔸 |
Quy tắc đơn giản:
- Cần thay đổi + có thứ tự → List
- Không thay đổi + tiết kiệm bộ nhớ → Tuple
- Tra cứu theo key → Dictionary
- Loại bỏ trùng lặp + phép toán tập hợp → Set