List comprehension (hiểu nén danh sách) trong Python là cách tạo một danh sách mới dựa trên một danh sách hiện có. List comprehension thường dùng để lọc phần tử khỏi danh sách hoặc thay đổi giá trị trong danh sách hiện có. List comprehension được viết bên trong cặp ngoặc vuông.
Khi làm việc với danh sách, bạn có thể muốn tạo một danh sách mới dựa trên nội dung của một chuỗi (sequence) đã có. Ví dụ, bạn muốn tạo danh sách dựa trên chuỗi ký tự, hoặc danh sách nhân đôi giá trị của danh sách khác.
Đó là lúc list comprehension phát huy tác dụng. Hướng dẫn này sẽ khám phá, kèm ví dụ, cơ bản về danh sách Python và cách sử dụng list comprehension.
Danh Sách Python: Ôn Tập Nhanh
Cấu trúc dữ liệu list cho phép lưu trữ tập hợp các mục trong Python. Danh sách thường dùng khi bạn muốn làm việc với nhiều giá trị liên quan nhau.
Ví dụ, bạn có thể dùng danh sách để lưu tất cả hương kem bán tại một cửa hàng kem. Hoặc lưu danh sách số điện thoại thành viên tại một câu lạc bộ rượu vang.
Ví dụ về danh sách trong Python:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']
Đã ôn xong cơ bản về danh sách, bây giờ hãy nói về list comprehension.
List Comprehension Trong Python
List comprehension trong Python tạo một danh sách mới từ nội dung của một danh sách khác. Bạn có thể dùng nó để sao chép danh sách, hoặc biến đổi nội dung danh sách cũ thành danh sách mới. Hoặc chuyển nội dung của bất kỳ đối tượng lặp (iterable) nào vào danh sách mới.
Bạn có thể chỉ định bộ lọc để danh sách mới chỉ chứa các giá trị nhất định. Ví dụ, tạo danh sách mới từ danh sách số, chỉ giữ số lớn hơn 250.
Cú pháp list comprehension trong Python:
[expression for item in list]
Cú pháp này tương tự câu lệnh for trong Python, nhưng viết gọn trên một dòng. Để phân biệt với câu lệnh for thông thường, list comprehension được bao quanh bởi cặp ngoặc vuông.
Có ba phần trong cú pháp trên:
- expression: Giá trị cuối cùng được thêm vào danh sách mới.
- item: Phần tử riêng lẻ trong danh sách đang được duyệt.
- list: Danh sách hoặc đối tượng iterable mà list comprehension duyệt qua (kiểu dữ liệu chấp nhận: tuple, string, list).
Bạn có thể dùng list comprehension với câu lệnh if...else bên trong:
[expression for item in list if condition else none]
Comprehension này chỉ thêm mục vào danh sách nếu thỏa mãn điều kiện chỉ định.
Sử dụng list comprehension giúp tạo danh sách mới từ danh sách cũ mà không cần viết toàn bộ câu lệnh for. Câu lệnh for chiếm ít nhất hai dòng code, trong khi list comprehension chỉ một dòng.
Một số người cho rằng list comprehension là code "Pythonic" hơn vì chúng hiệu quả hơn câu lệnh for ngắn.
Ví Dụ List Comprehension Trong Python
Giả sử chúng ta muốn tạo danh sách tất cả các loại pizza gà bán tại cửa hàng. Chúng ta sẽ chuyển tất cả pizza gà vào danh mục Chicken trên menu. Có thể lọc bằng câu lệnh for, hoặc dùng list comprehension.
Dùng list comprehension tạo danh sách mới các pizza có tên chứa Chicken dựa trên danh sách pizza hiện có:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] chicken_pizzas = [p for p in pizzas if "Chicken" in p] print(chicken_pizzas)
Kết quả trả về:
['Chicken', 'Chicken and Bacon', 'BBQ Chicken']
Trong code, trước tiên chúng ta định nghĩa danh sách pizza trên menu, lưu trong biến pizzas. Sau đó dùng list comprehension tạo danh sách mới các pizza có tên chứa Chicken.
List comprehension bao gồm các phần:
- p: Giá trị được thêm vào danh sách mới.
- for p in pizzas: Duyệt qua từng pizza trong danh sách "pizzas".
- if "Chicken" in p: Kiểm tra xem mỗi pizza có chứa "Chicken" không. Nếu True, giá trị trong "p" được thêm vào danh sách.
List comprehension chỉ mất một dòng code. Trong khi ví dụ tiếp theo dùng câu lệnh for cần ba dòng code. Điều này cho thấy list comprehension giúp viết code gọn gàng hơn.
Không Dùng List Comprehension
Quay lại ví dụ pizza gà. Không dùng list comprehension, để tạo danh sách pizza gà trên menu, code sẽ như sau:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']
chicken_pizzas = []
for pizza in pizzas:
if "Chicken" in pizza:
chicken_pizzas.append(pizza)
print(chicken_pizzas)
Kết quả trả về:
['Chicken', 'Chicken and Bacon', 'BBQ Chicken']
Trước tiên, chúng ta định nghĩa hai danh sách. Một lưu pizza bán tại cửa hàng, một lưu pizza gà (ban đầu rỗng). Dùng câu lệnh for duyệt qua từng pizza. Kiểm tra xem pizza có chứa từ Chicken không. Nếu có, thêm pizza vào danh sách pizza gà. Trong trường hợp này, ba pizza chứa Chicken và tất cả được thêm vào chicken_pizzas.
Như bạn thấy, để kiểm tra và thêm pizza, cần ba dòng code. Cách hiệu quả hơn: dùng list comprehension.
List Comprehension Với If...Else
Bạn cũng có thể dùng câu lệnh if...else với list comprehension.
Trước đó, chúng ta dùng if để thêm pizza vào danh sách pizza gà. Chỉ thêm nếu tên pizza chứa Chicken. Nhưng giả sử chúng ta tạo danh sách pizza nào là vegetarian.
Muốn thêm "Meat" nếu tên pizza chứa Chicken, và "Vegetarian" nếu không chứa. Điều này có thể làm bằng list comprehension:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] is_veggie = ["Meat" if "Chicken" in p else "Vegetarian" for p in pizzas] print(is_veggie)
Kết quả trả về:
['Meat', 'Vegetarian', 'Meat', 'Vegetarian', 'Vegetarian', 'Meat']
Phân tích code: Đầu tiên khai báo danh sách pizza pizzas. Sau đó dùng list comprehension đánh giá xem tên pizza có chứa Chicken hay không.
Nếu chứa Chicken, giá trị Meat được thêm vào danh sách is_veggie. Ngược lại, thêm Vegetarian.
Như bạn thấy, giá trị đầu tiên trong is_veggie là Meat, vì giá trị tương ứng trong pizzas là Chicken. Giá trị tiếp theo là Vegetarian, vì giá trị tương ứng là Margherita, không chứa Chicken.
Kết Luận
List comprehension cho phép tạo danh sách mới dựa trên danh sách hiện có. Bạn có thể tạo bản sao danh sách, hoặc tạo danh sách mới lọc bỏ giá trị từ danh sách cũ.
Hướng dẫn này đã thảo luận, kèm ví dụ, cơ bản về danh sách Python và kỹ thuật list comprehension để tạo danh sách mới.
Bạn muốn tìm hiểu thêm về lập trình Python? Xem hướng dẫn How to Learn Python của chúng tôi. Hướng dẫn chứa danh sách tài nguyên học tập giúp bạn tiếp tục hành trình thành thạo Python.