Có thể bạn đã nghe nói về List Comprehension trong ngôn ngữ lập trình Python và có thể đã sử dụng mà không thực sự hiểu biết về chúng. Do vậy, bài viết này sẽ giới thiệu và hướng dẫn cho các bạn cách sử dụng List Comprehension trong Python.
List Comprehension trong Python là gì?
List Comprehension (cách viết code ngắn gọn để tạo một danh sách phức tạp) nghe có vẻ phức tạp nhưng thực tế không phải như vậy. Trong Python, nó chỉ đơn giản là cách nhanh chóng để lọc hoặc chỉnh sửa một danh sách dựa trên một số tiêu chí. List Comprehension giúp bạn viết code ngắn gọn (đặc biệt khi đang ở trong một vòng lặp đã có) và dễ đọc, nhìn code hơn.
Xem thêm: Các kỹ thuật vòng lặp trong Python
Cách sử dụng List Comprehensions trong Python
Lưu ý: Các ví dụ này đều sử dụng Python 3.6.
Hãy xem xét đoạn code này, sao chép một array (mảng) và biến mỗi chữ cái trong array này thành chữ viết hoa. Nó thực hiện điều này bằng cách lặp lại từng mục trong array.
letters = ['a', 'b', 'c', 'd']
print(letters)
upper_letters = []
for letter in letters:
result = letter.upper()
upper_letters.append(result)
print(upper_letters
Bây giờ ví dụ dưới đây cũng tương tự như trên, nhưng thực hiện trong một dòng code duy nhất sử dụng List Comprehension Python cơ bản:
letters = ['a', 'b', 'c', 'd']
print(letters)
upper_letters = [x.upper() for x in letters]
print(upper_letters)
Như bạn có thể thấy, kết quả của hai code trên là giống nhau nhưng quá trình trên sử dụng nhiều code hơn khi sử dụng List Comprehension.
Nếu cảm thấy khó hiểu hãy phân tích ví dụ sử dụng List Comprehension trên nhé.
Ví dụ này tạo ra một list (danh sách) được gọi là letters để lưu trữ các chữ thường “a”, “b”, “c” và “d”. Giả sử bạn muốn biến tất cả các phần tử trong danh sách này thành chữ hoa mà không sử dụng List Comprehension, bạn sẽ phải tạo một danh sách mới lưu trữ kết quả (được gọi là upper_letters), lặp qua mọi phần tử trong danh sách letters, chuyển đổi từng chữ cái (và lưu trữ nó trong result), và sau đó thêm chữ viết hoa vào trong danh sách mới. Bạn thấy đấy, có quá nhiều việc cần làm.
List Comprehension ở đây gần như tương đương, thay thế vòng lặp. Nó chuyển đổi mỗi một chữ cái trong danh sách letters và trả về kết quả như một danh sách mới. List Comprehension chỉ làm việc trên danh sách và trả lại trên danh sách mới.
Có ba phần trong List Comprehension. List Comprehension phải bắt đầu và kết thúc bằng dấu ngoặc vuông ([ và ]). Đây là cách nó được thiết kế và cho phép Python biết rằng bạn sẽ làm việc với một danh sách.
Bên trong dấu ngoặc vuông này, bạn cần bắt đầu với kết quả. Đây là những gì bạn muốn làm với mỗi phần tử trong danh sách. Trong ví dụ trên, đoạn code sau chuyển đổi mỗi phần tử (được tham chiếu bằng tên biến x) thành chữ viết hoa sử dụng phương thức upper(), là một phần của thư viện cơ bản Python:
[x.upper() # will not run, only half the comprehension at this point
Tiếp theo, bạn cần nói cho Python biết danh sách cần làm việc và gán mỗi phần tử riêng biệt với một biến. Điều này hoàn toàn giống với vòng lặp trong ví dụ trước.
for x in letters
Mỗi khi vòng lặp đi qua danh sách, giá trị của x sẽ thay đổi thành bất kỳ phần tử hiện tại nào. Nó sẽ bắt đầu với “a”, và sau đó “b”, và tiếp tục như vậy.
Nếu bạn đặt tất cả lại với nhau (và gán nó cho một biến gọi là upper_letters), bạn thực hiện như sau:
upper_letters = [x.upper() for x in letters]
Bây giờ, upper_letters sẽ chứa một danh sách các chữ hoa, bắt đầu từ “A”, và sau đó “B”, v.v…
Phần thứ ba của List Comprehension trong Python
Như đã đề cập ở trên, đây là phần thứ ba của List Comprehension. Khi đã thực hiện hai bước trên, bạn có thể thêm điều kiện tùy chọn. Đây cũng giống như sử dụng lệnh if để nói với Python tạo một danh sách mới, dựa trên danh sách cũ nhưng chỉ bao gồm phần tử hợp với tiêu chuẩn đề ra.
ages = [1, 34, 5, 7, 3, 57, 356]
print(ages)
old_ages = [x for x in ages if x > 10]
print(old_ages)
Ví dụ này sử dụng danh sách mới được gọi là ages. Danh sách old_ages được tạo bằng cách sử dụng List Comprehension. Điều kiện if ở cuối nghĩa là chỉ có các phần tử trong danh sách phù hợp với tiêu chí mới được thêm vào danh sách mới. Trong ví dụ này, bất cứ tuổi nào lớn hơn 10 đều được thêm vào danh sách.
Trường hợp không nên sử dụng List Comprehension
List Comprehension rất tuyệt nhưng không phải trường hợp nào cũng có thể sử dụng nó. Bạn không nên sử dụng nó khi có nhiều hơn một điều kiện.
old_ages = [x for x in ages if x > 10 and x < 100 and x is not None]
Code này vẫn hoạt động nhưng nó bắt đầu dài và khó hiểu. Tương tự như vậy, bất cứ code nào có nhiều hơn một hàm đơn giản cũng không nên sử dụng List Comprehension. Trong ví dụ này, bạn sẽ nhận lỗi:
letters = ['a', 'b', 'c', 'd', 2]
print(letters)
upper_letters = [x.upper() for x in letters]
print(upper_letters)
Đây là code hoàn toàn hợp lệ, nhưng vì bạn không thể viết hoa số, nên nó không hoạt động. Trong trường hợp này, bạn nên sử dụng vòng lặp vì có thể thực hiện một số ngoại lệ:
letters = ['a', 'b', 'c', 'd', 1]
print(letters)
upper_letters = []
for letter in letters:
try:
result = letter.upper()
upper_letters.append(result)
except AttributeError:
pass # do nothing
print(upper_letters)
Bây giờ bạn đã biết cách sử dụng List Comprehension, do đó không có lý do gì mà không sử dụng nó để đơn giản hóa code, giúp dễ hiểu hơn.