Skip to content

🛠️ 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 đổi

3. 🗑️ 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ácPhương thứcVí dụKết quả
Thêm cuốiappend()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ềuextend()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:

  1. 🔄 List thay đổi được: Các thao tác sửa đổi list gốc
  2. 📍 Index bắt đầu từ 0: Phần tử đầu tiên có index 0
  3. ⚠️ IndexError: Truy cập index không tồn tại gây lỗi
  4. 🎯 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!

🐍 Khóa học Python căn bản bằng tiếng Việt