Bỏ qua để đến nội dung

So sánh List, Tuple, Dictionary, Set

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ệu
my_list = [1, 2, 3, 2, 1] # List - cho phép trùng lặp
my_tuple = (1, 2, 3, 2, 1) # Tuple - cho phép trùng lặp
my_dict = {"a": 1, "b": 2, "c": 3} # Dictionary - key-value pairs
my_set = {1, 2, 3} # Set - không trùng lặp
# 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:value
person = {"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!
# 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!
# List - CÓ THỂ thay đổi
my_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 đổi
my_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ới
my_tuple = my_tuple + (4,) # (1, 2, 3, 4)
# Dictionary - CÓ THỂ thay đổi
my_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ới
# List - CHO PHÉP trùng lặp
my_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ặp
my_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ùng
my_dict = {"a": 1, "b": 1, "a": 2} # Key "a" bị trùng
print(my_dict) # {"a": 2, "b": 1} - key sau ghi đè key trước
# Set - KHÔNG cho phép trùng lặp
my_set = {1, 2, 2, 3, 3, 3}
print(my_set) # {1, 2, 3} - tự động loại bỏ trùng lặp
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
  • 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ữ 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ố định
rgb_red = (255, 0, 0)
date = (2025, 1, 15)
# Làm key cho dictionary
locations = {
(10, 20): "Point A",
(30, 40): "Point B"
}
  • 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ùng
user = {
"name": "Alice",
"age": 25,
"email": "[email protected]"
}
# Đếm tần suất
word_count = {"hello": 5, "world": 3}
# Cấu hình ứng dụng
config = {
"debug": True,
"port": 8080,
"database": "mysql"
}
  • 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ặp
numbers = [1, 2, 3, 2, 1, 4, 3]
unique = set(numbers) # {1, 2, 3, 4}
# Kiểm tra quyền truy cập
admin_users = {"alice", "bob", "admin"}
if username in admin_users:
print("Granted")
# Tìm phần tử chung
class_a = {"Alice", "Bob", "Charlie"}
class_b = {"Bob", "David", "Eve"}
both = class_a & class_b # {"Bob"}
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 keyDictionary
  • Loại bỏ trùng lặp + phép toán tập hợpSet