Câu 1Với nums = [10, 20, 30], nums sẽ chứa gì sau khi bạn chạy nums.append([40, 50])?
Cách sử dụng list trong Python
Học cách dùng kiểu list trong Python: khai báo, truy cập theo chỉ số, slicing và các phương thức thông dụng để thao tác với danh sách.
Tạo một list
Với danh sách (list), bạn có thể gom nhiều giá trị lại cùng một chỗ. Khác với int hay str — nơi một biến chỉ giữ một giá trị — list có thể xếp bao nhiêu giá trị tùy ý cạnh nhau.
Bạn khai báo bằng cách đặt các giá trị trong [ và ], phân tách bằng dấu phẩy.
Giống như với chuỗi, bạn truy cập các phần tử bằng index bắt đầu từ 0. [0] cho bạn phần tử đầu tiên, và [-1] cho phần tử cuối cùng.
Một đặc điểm quan trọng của list là bạn có thể thay đổi giá trị của nó về sau.
# Khai báo một list
numbers = [10, 20, 30, 40]
# List rỗng (sẽ được thêm vào sau)
empty = []
# Truy cập
print(numbers[0]) # 10
print(numbers[-1]) # 40
# Ghi đè
numbers[1] = 99
print(numbers) # [10, 99, 30, 40]
# Trộn các kiểu khác nhau cũng được
mixed = [1, "apple", 3.14, True]
print(mixed[1]) # apple
List lồng nhau (list bên trong list)
Bạn cũng có thể đặt list bên trong list, ví dụ [[1, 2], [3, 4]]. Để lấy một giá trị ra, bạn nối hai index như data[1][0]. Cách này tiện khi xử lý dữ liệu dạng bảng, nhưng khi mới bắt đầu thì một list phẳng là đủ.
Slice (cắt lát)
List dùng cùng cú pháp slice như chuỗi. [start:end] cho bạn một list con, [::step] duyệt theo bước, và [-n:] lấy n phần tử cuối.
Kết quả của slice là một list.
[:3] lấy 3 phần tử đầu (nửa mở, không gồm điểm cuối), và [-2:] lấy 2 phần tử cuối.
Hoạt động y hệt như slice của chuỗi.
nums = [1, 2, 3, 4, 5]
print(nums[:3]) # [1, 2, 3]
print(nums[2:]) # [3, 4, 5]
print(nums[-2:]) # [4, 5]
print(nums[::2]) # [1, 3, 5] (cách một phần tử)
# List gốc không đổi (một list mới được trả về)
print(nums) # [1, 2, 3, 4, 5]
Thêm và xóa phần tử
List có rất nhiều phương thức để thêm hoặc xóa phần tử. Các phương thức này thay đổi trực tiếp chính list đó. Nói cách khác, khi gọi list.append(...), list sẽ bị sửa tại chỗ.
| Phương thức | Tác dụng |
|---|---|
| append(x) | Thêm một phần tử vào cuối |
| extend(iterable) | Nối toàn bộ phần tử của một list khác vào cuối |
| insert(i, x) | Chèn x vào vị trí i |
| remove(x) | Quét từ trái sang và xóa phần tử đầu tiên khớp x |
| pop(i) | Xóa phần tử ở vị trí i và trả về nó (mặc định là phần tử cuối) |
| clear() | Xóa hết, làm list rỗng |
append thêm "một phần tử".
extend "tháo rời và thêm" từng phần tử.
Dù truyền cùng [4, 5], kết quả vẫn khác nhau.
box = [1, 2, 3]
# Thêm
box.append("apple") # thêm một phần tử vào cuối
print(box) # [1, 2, 3, 'apple']
box.extend(["banana", "grape"]) # tháo rời và nối vào cuối
print(box) # [1, 2, 3, 'apple', 'banana', 'grape']
box.insert(1, "NEW") # chèn vào index 1
print(box) # [1, 'NEW', 2, 3, 'apple', 'banana', 'grape']
# Xóa
box.remove("apple") # xóa phần tử đầu tiên khớp giá trị
print(box) # [1, 'NEW', 2, 3, 'banana', 'grape']
v = box.pop(0) # lấy index 0 ra và trả về
print(v) # 1
print(box) # ['NEW', 2, 3, 'banana', 'grape']
remove / pop khi không có → lỗi
remove(x) sẽ ném ValueError nếu x không có trong list, còn pop(i) sẽ ném IndexError nếu i nằm ngoài khoảng. Một mẫu an toàn là kiểm tra sự tồn tại trước bằng if x in box: trước khi xóa.
Sắp xếp và tìm kiếm (sort / reverse / count / index)
List cũng có các phương thức sắp xếp và tìm kiếm. Điều quan trọng ở đây là có hai loại phương thức.
- Phương thức làm thay đổi list (sort / reverse) → không cần lấy giá trị trả về; chính list sẽ đổi
- Phương thức trả về giá trị (count / index) → sử dụng giá trị trả về, ví dụ print(list.count(...))
sort / reverse: sửa list trực tiếp. Đừng gán kết quả.
count / index: không đụng đến list — chúng trả về giá trị. Hãy nhận và dùng.
fruits = ["banana", "lemon", "apple", "grape"]
# (1) Phương thức thay đổi: chỉ cần gọi, list đã đổi
fruits.sort()
print(fruits) # ['apple', 'banana', 'grape', 'lemon']
fruits.reverse()
print(fruits) # ['lemon', 'grape', 'banana', 'apple']
# (2) Phương thức trả về: nhận và dùng giá trị trả về
nums = [1, 2, 2, 3, 2, 4]
print(nums.count(2)) # 3 (có ba số 2)
print(nums.index(3)) # 3 (số 3 là phần tử thứ 4 = index 3)
Vì sao print(fruits.sort()) lại in ra None
Một lỗi phổ biến: viết print(fruits.sort()) và thấy None được in ra. sort() không trả về giá trị — nó sắp xếp fruits tại chỗ.
Cách sửa đúng là gọi fruits.sort() riêng, rồi print(fruits) ở dòng tiếp theo — tách thành hai dòng.
Nhân tiện, chi tiết về giá trị trả về (giá trị mà phương thức và hàm trả lại) sẽ được trình bày trong các bài về hàm và lập trình hướng đối tượng. Bây giờ, bạn chỉ cần nhớ hai mẫu: "sort / reverse làm list thay đổi chỉ bằng lời gọi" và "count / index được nhận bằng = rồi sử dụng".
Trong bài này, bạn đã học cách tạo và truy cập list, slice, thêm và xóa phần tử, cùng sắp xếp và tìm kiếm.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Với items = [3, 1, 4, 1, 5], print(items.sort()) in ra gì?
Câu 3Với data = [10, 20, 30, 40], kết quả của data[-2:] là gì?