🛠️ 8.2 Các thao tác cơ bản
📖 Giới thiệu
Sau khi biết cách khai báo list, chúng ta sẽ học các thao tác cơ bản để làm việc với list: thêm phần tử, xóa phần tử, sửa phần tử và truy cập phần tử theo vị trí.
Mục tiêu bài học:
- Thêm, xóa, sửa phần tử trong list
- Truy cập phần tử theo index và slice
- Kết hợp các thao tác để xử lý dữ liệu
- Hiểu cách list thay đổi trong bộ nhớ
🔧 Cú pháp các thao tác
1. ➕ Thêm phần tử
python
# Thêm 1 phần tử vào cuối
fruits = ["táo", "cam"]
fruits.append("chuối")
print(fruits) # ["táo", "cam", "chuối"]
# Thêm phần tử vào vị trí bất kỳ
fruits.insert(1, "xoài") # Vị trí 1
print(fruits) # ["táo", "xoài", "cam", "chuối"]
# Thêm nhiều phần tử
fruits.extend(["nho", "dưa"])
print(fruits) # ["táo", "xoài", "cam", "chuối", "nho", "dưa"]2. ❌ Xóa phần tử
python
# Xóa theo vị trí
numbers = [1, 2, 3, 4, 5]
numbers.pop(2) # Xóa vị trí 2 (số 3)
print(numbers) # [1, 2, 4, 5]
# Xóa theo giá trị
numbers.remove(4) # Xóa số 4
print(numbers) # [1, 2, 5]
# Xóa tất cả
numbers.clear()
print(numbers) # []3. ✏️ Sửa phần tử
python
# Sửa 1 phần tử
colors = ["đỏ", "xanh", "vàng"]
colors[1] = "xanh lá"
print(colors) # ["đỏ", "xanh lá", "vàng"]
# Sửa nhiều phần tử
colors[1:3] = ["tím", "hồng"]
print(colors) # ["đỏ", "tím", "hồng"]🔬 Phân tích & Giải thích chi tiết
1. 🔍 Truy cập phần tử (Index & Slice)
python
animals = ["chó", "mèo", "gà", "vịt", "heo"]
# Truy cập theo index dương
print(animals[0]) # "chó" (đầu tiên)
print(animals[2]) # "gà" (thứ 3)
print(animals[4]) # "heo" (cuối cùng)
# Truy cập theo index âm
print(animals[-1]) # "heo" (cuối cùng)
print(animals[-2]) # "vịt" (áp cuối)
print(animals[-5]) # "chó" (đầu tiên)
# Cắt list (slicing)
print(animals[1:4]) # ["mèo", "gà", "vịt"] (từ vị trí 1-3)
print(animals[:3]) # ["chó", "mèo", "gà"] (từ đầu đến vị trí 2)
print(animals[2:]) # ["gà", "vịt", "heo"] (từ vị trí 2 đến cuối)
print(animals[:]) # Toàn bộ list
print(animals[::2]) # ["chó", "gà", "heo"] (cách 1)2. 📊 So sánh các cách thêm phần tử
python
# Khởi tạo
numbers = [1, 2, 3]
print(f"Ban đầu: {numbers}")
# append() - thêm 1 phần tử vào cuối
numbers.append(4)
print(f"Sau append(4): {numbers}")
# insert() - thêm vào vị trí cụ thể
numbers.insert(0, 0) # Thêm 0 vào đầu
print(f"Sau insert(0, 0): {numbers}")
# extend() - thêm nhiều phần tử
numbers.extend([5, 6])
print(f"Sau extend([5, 6]): {numbers}")
# + operator - tạo list mới
new_numbers = numbers + [7, 8]
print(f"numbers + [7, 8]: {new_numbers}")
print(f"numbers gốc: {numbers}") # Không thay đổi3. 🗑️ So sánh các cách xóa phần tử
python
# Khởi tạo
fruits = ["táo", "cam", "chuối", "xoài", "nho"]
print(f"Ban đầu: {fruits}")
# pop() - xóa theo vị trí, trả về phần tử
phan_tu_xoa = fruits.pop(2) # Xóa vị trí 2
print(f"Xóa '{phan_tu_xoa}': {fruits}")
# remove() - xóa theo giá trị (lần đầu gặp)
fruits.remove("xoài")
print(f"Sau remove('xoài'): {fruits}")
# del - xóa theo vị trí hoặc slice
del fruits[0] # Xóa vị trí 0
print(f"Sau del fruits[0]: {fruits}")
# clear() - xóa tất cả
fruits_copy = fruits.copy()
fruits_copy.clear()
print(f"Sau clear(): {fruits_copy}")
print(f"fruits gốc: {fruits}") # Không ảnh hưởng💻 Ví dụ minh họa
Ví dụ 1: Quản lý danh sách mua sắm
python
# quan_ly_mua_sam.py
print("🛒 QUẢN LÝ DANH SÁCH MUA SẮM")
print("=" * 35)
danh_sach_mua = []
while True:
print(f"\n📋 Danh sách hiện tại ({len(danh_sach_mua)} món):")
if danh_sach_mua:
for i, mon in enumerate(danh_sach_mua, 1):
print(f" {i}. {mon}")
else:
print(" (Danh sách trống)")
print(f"\n🛠️ THAO TÁC:")
print("1. Thêm món")
print("2. Xóa món (theo tên)")
print("3. Xóa món (theo số thứ tự)")
print("4. Sửa món")
print("5. Thêm vào vị trí cụ thể")
print("0. Hoàn thành mua sắm")
lua_chon = input("Chọn (0-5): ").strip()
if lua_chon == "0":
if danh_sach_mua:
print(f"\n🎯 DANH SÁCH CUỐI CÙNG:")
for i, mon in enumerate(danh_sach_mua, 1):
print(f" {i}. {mon}")
print("🛒 Chúc bạn mua sắm vui vẻ!")
break
elif lua_chon == "1":
# Thêm món
mon_moi = input("Nhập món cần mua: ").strip().title()
if mon_moi:
if mon_moi in danh_sach_mua:
print(f"⚠️ '{mon_moi}' đã có trong danh sách!")
else:
danh_sach_mua.append(mon_moi)
print(f"✅ Đã thêm '{mon_moi}'")
else:
print("❌ Tên món không được để trống!")
elif lua_chon == "2":
# Xóa theo tên
if not danh_sach_mua:
print("❌ Danh sách trống!")
continue
mon_xoa = input("Nhập tên món cần xóa: ").strip().title()
if mon_xoa in danh_sach_mua:
danh_sach_mua.remove(mon_xoa)
print(f"🗑️ Đã xóa '{mon_xoa}'")
else:
print(f"❌ Không tìm thấy '{mon_xoa}'")
elif lua_chon == "3":
# Xóa theo số thứ tự
if not danh_sach_mua:
print("❌ Danh sách trống!")
continue
try:
so_thu_tu = int(input(f"Nhập số thứ tự (1-{len(danh_sach_mua)}): "))
if 1 <= so_thu_tu <= len(danh_sach_mua):
mon_xoa = danh_sach_mua.pop(so_thu_tu - 1)
print(f"🗑️ Đã xóa '{mon_xoa}'")
else:
print("❌ Số thứ tự không hợp lệ!")
except ValueError:
print("❌ Vui lòng nhập số!")
elif lua_chon == "4":
# Sửa món
if not danh_sach_mua:
print("❌ Danh sách trống!")
continue
try:
so_thu_tu = int(input(f"Số thứ tự cần sửa (1-{len(danh_sach_mua)}): "))
if 1 <= so_thu_tu <= len(danh_sach_mua):
mon_cu = danh_sach_mua[so_thu_tu - 1]
mon_moi = input(f"Sửa '{mon_cu}' thành: ").strip().title()
if mon_moi:
danh_sach_mua[so_thu_tu - 1] = mon_moi
print(f"✏️ Đã sửa '{mon_cu}' → '{mon_moi}'")
else:
print("❌ Tên mới không được để trống!")
else:
print("❌ Số thứ tự không hợp lệ!")
except ValueError:
print("❌ Vui lòng nhập số!")
elif lua_chon == "5":
# Thêm vào vị trí cụ thể
mon_moi = input("Món cần thêm: ").strip().title()
if not mon_moi:
print("❌ Tên món không được để trống!")
continue
try:
vi_tri = int(input(f"Vị trí thêm (1-{len(danh_sach_mua) + 1}): "))
if 1 <= vi_tri <= len(danh_sach_mua) + 1:
danh_sach_mua.insert(vi_tri - 1, mon_moi)
print(f"📌 Đã thêm '{mon_moi}' vào vị trí {vi_tri}")
else:
print("❌ Vị trí không hợp lệ!")
except ValueError:
print("❌ Vui lòng nhập số!")
else:
print("❌ Lựa chọn không hợp lệ!")Ví dụ 2: Sắp xếp điểm số học sinh
python
# sap_xep_diem.py
print("📊 SẮP XẾP ĐIỂM SỐ HỌC SINH")
print("=" * 35)
# Nhập danh sách học sinh
hoc_sinh = []
diem_so = []
so_hoc_sinh = int(input("Số lượng học sinh: "))
for i in range(so_hoc_sinh):
print(f"\n👤 Học sinh thứ {i + 1}:")
ten = input("Họ tên: ").strip().title()
while True:
try:
diem = float(input("Điểm (0-10): "))
if 0 <= diem <= 10:
break
print("❌ Điểm phải từ 0-10!")
except ValueError:
print("❌ Vui lòng nhập số!")
hoc_sinh.append(ten)
diem_so.append(diem)
# Hiển thị danh sách ban đầu
print(f"\n📋 DANH SÁCH BAN ĐẦU:")
print("-" * 30)
for i in range(len(hoc_sinh)):
print(f"{i + 1:2}. {hoc_sinh[i]:15} - {diem_so[i]:4.1f} điểm")
# Sắp xếp theo điểm giảm dần (bubble sort đơn giản)
print(f"\n🔄 Đang sắp xếp theo điểm...")
for i in range(len(diem_so)):
for j in range(len(diem_so) - 1 - i):
if diem_so[j] < diem_so[j + 1]: # Đổi chỗ nếu điểm thấp hơn
# Hoán đổi điểm
diem_so[j], diem_so[j + 1] = diem_so[j + 1], diem_so[j]
# Hoán đổi tên tương ứng
hoc_sinh[j], hoc_sinh[j + 1] = hoc_sinh[j + 1], hoc_sinh[j]
# Hiển thị sau sắp xếp
print(f"\n🏆 BẢNG XẾP HẠNG (cao → thấp):")
print("-" * 35)
print(f"{'Hạng':4} {'Họ tên':15} {'Điểm':6} {'Xếp loại':10}")
print("-" * 35)
for i in range(len(hoc_sinh)):
# Xếp loại
if diem_so[i] >= 8.5:
xep_loai = "Giỏi"
elif diem_so[i] >= 7.0:
xep_loai = "Khá"
elif diem_so[i] >= 5.5:
xep_loai = "TB"
else:
xep_loai = "Yếu"
print(f"{i + 1:4} {hoc_sinh[i]:15} {diem_so[i]:6.1f} {xep_loai:10}")
# Thống kê
diem_cao_nhat = max(diem_so)
diem_thap_nhat = min(diem_so)
diem_trung_binh = sum(diem_so) / len(diem_so)
print(f"\n📈 THỐNG KÊ:")
print(f"Điểm cao nhất: {diem_cao_nhat:.1f}")
print(f"Điểm thấp nhất: {diem_thap_nhat:.1f}")
print(f"Điểm trung bình: {diem_trung_binh:.2f}")Ví dụ 3: Trò chơi đoán từ
python
# tro_choi_doan_tu.py
import random
print("🎯 TRÒ CHƠI ĐOÁN TỪ")
print("=" * 20)
# Ngân hàng từ
tu_vung = [
"python", "laptop", "internet", "facebook", "youtube",
"computer", "keyboard", "mouse", "screen", "software"
]
# Chọn từ ngẫu nhiên
tu_bi_mat = random.choice(tu_vung).upper()
tu_hien_thi = ["_"] * len(tu_bi_mat) # Danh sách ký tự ẩn
chu_cai_da_doan = [] # Danh sách chữ cái đã đoán
so_lan_sai = 0
max_lan_sai = 6
print(f"🎮 Đoán từ có {len(tu_bi_mat)} chữ cái!")
print(f"💔 Bạn có tối đa {max_lan_sai} lần đoán sai.")
while True:
# Hiển thị trạng thái hiện tại
print(f"\n📝 Từ: {' '.join(tu_hien_thi)}")
print(f"🔤 Đã đoán: {', '.join(sorted(chu_cai_da_doan)) if chu_cai_da_doan else '(chưa có)'}")
print(f"💔 Sai: {so_lan_sai}/{max_lan_sai}")
# Kiểm tra thắng
if "_" not in tu_hien_thi:
print(f"\n🎉 CHÚC MỪNG! Bạn đã đoán đúng từ '{tu_bi_mat}'!")
break
# Kiểm tra thua
if so_lan_sai >= max_lan_sai:
print(f"\n💀 GAME OVER! Từ đúng là '{tu_bi_mat}'")
break
# Nhập chữ cái
guess = input("\nĐoán chữ cái: ").strip().upper()
# Kiểm tra đầu vào
if len(guess) != 1:
print("❌ Vui lòng nhập 1 chữ cái!")
continue
if not guess.isalpha():
print("❌ Chỉ được nhập chữ cái!")
continue
if guess in chu_cai_da_doan:
print(f"⚠️ Bạn đã đoán '{guess}' rồi!")
continue
# Thêm vào danh sách đã đoán
chu_cai_da_doan.append(guess)
# Kiểm tra chữ cái có trong từ không
if guess in tu_bi_mat:
print(f"✅ Đúng! Chữ '{guess}' có trong từ.")
# Cập nhật từ hiển thị
for i in range(len(tu_bi_mat)):
if tu_bi_mat[i] == guess:
tu_hien_thi[i] = guess
else:
so_lan_sai += 1
print(f"❌ Sai! Chữ '{guess}' không có trong từ.")
# Hỏi chơi lại
choi_lai = input("\n🔄 Chơi lại? (y/n): ").lower()
if choi_lai in ['y', 'yes']:
print("🚀 Khởi động lại game...")
# Ở đây có thể restart game
else:
print("👋 Cảm ơn bạn đã chơi!")🏋️ Thực hành
Bài tập 1: Lọc số chẵn/lẻ
Nhiệm vụ: Tách list thành 2 list số chẵn và số lẻ
python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
so_chan = []
so_le = []
for so in numbers:
if so % 2 == 0:
so_chan.append(so)
else:
so_le.append(so)
print(f"Số chẵn: {so_chan}")
print(f"Số lẻ: {so_le}")Bài tập 2: Xóa phần tử trùng lặp
Nhiệm vụ: Loại bỏ phần tử trùng, giữ thứ tự
python
fruits = ["táo", "cam", "táo", "chuối", "cam", "xoài", "táo"]
fruits_unique = []
for fruit in fruits:
if fruit not in fruits_unique:
fruits_unique.append(fruit)
print(f"Gốc: {fruits}")
print(f"Không trùng: {fruits_unique}")Bài tập 3: Tìm và thay thế
Nhiệm vụ: Tìm tất cả vị trí của phần tử và thay thế
python
colors = ["đỏ", "xanh", "đỏ", "vàng", "đỏ", "tím"]
tim = "đỏ"
thay_the = "hồng"
print(f"Trước: {colors}")
# Tìm tất cả vị trí
vi_tri_list = []
for i in range(len(colors)):
if colors[i] == tim:
vi_tri_list.append(i)
print(f"Vị trí của '{tim}': {vi_tri_list}")
# Thay thế tất cả
for i in vi_tri_list:
colors[i] = thay_the
print(f"Sau: {colors}")📋 Tóm tắt
Các thao tác cơ bản với list:
| Thao tác | Phương thức | Ví dụ | Kết quả |
|---|---|---|---|
| Thêm cuối | append() | list.append(x) | Thêm x vào cuối |
| Thêm vị trí | insert() | list.insert(i, x) | Thêm x vào vị trí i |
| Thêm nhiều | extend() | list.extend([1,2]) | Thêm nhiều phần tử |
| Xóa vị trí | pop() | list.pop(i) | Xóa và trả về vị trí i |
| Xóa giá trị | remove() | list.remove(x) | Xóa x đầu tiên |
| Xóa tất cả | clear() | list.clear() | Xóa hết |
Truy cập và slicing:
python
list = [0, 1, 2, 3, 4]
# Index
list[0] # 0 (đầu tiên)
list[-1] # 4 (cuối cùng)
# Slicing
list[1:4] # [1, 2, 3]
list[:3] # [0, 1, 2]
list[2:] # [2, 3, 4]
list[::2] # [0, 2, 4]Lưu ý quan trọng:
- 🔄 List thay đổi được: Các thao tác sửa đổi list gốc
- 📍 Index bắt đầu từ 0: Phần tử đầu tiên có index 0
- ⚠️ IndexError: Truy cập index không tồn tại gây lỗi
- 🎯 Slice không lỗi: slice[100:200] không gây lỗi dù vượt quá
Chuẩn bị cho bài tiếp theo:
Bài tiếp theo sẽ học về 📦 Hàm dựng sẵn với list - các hàm tiện ích!
💡 Mẹo: Luôn kiểm tra index hợp lệ trước khi truy cập để tránh lỗi!
🛠️ Thực hành: Thử kết hợp các thao tác để tạo ra chương trình phức tạp!