Python cung cấp cú pháp gọn gàng để tạo ra một list từ list khác. Những biểu thức này được gọi là list comprehension. Đây là một trong những công cụ mạnh mẽ nhất của Python, thể hiện sự hỗ trợ của ngôn ngữ cho các khái niệm lập trình hàm.
List comprehension là cách rất dễ dàng để áp dụng một hàm hoặc lọc các mục trong một list. Nếu sử dụng đúng cách, chúng rất hữu ích, nhưng có thể trở nên khó đọc nếu không cẩn thận.
Cú pháp
Cú pháp chung của list comprehension:
[biểu_thức for phần_tử in iterable if điều_kiện]
Tương đương với:
for phần_tử in iterable:
if điều_kiện:
biểu_thức
Ví dụ: tính bình phương của từng số trong một list.
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> squares = [x**2 for x in lst]
>>> print(squares)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
List Comprehension so với Vòng lặp For
# SỬ DỤNG VÒNG LẶP FOR
evens = []
for i in range(10):
if i % 2 == 0:
evens.append(i)
print(evens)
[0, 2, 4, 6, 8]
Cách tốt và nhanh hơn là dùng list comprehension:
>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
Code ngắn gọn hơn, ít yếu tố hơn và hiệu quả hơn.
List Comprehension so với Hàm Lambda
Trừ khi áp dụng hàm một đối số, list comprehension rõ ràng hơn hàm map tích hợp cho các trường hợp đơn giản. map yêu cầu tạo hàm lambda, gây rối mắt.
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: x**2, lst))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Khác với map, list comprehension cho phép dễ dàng lọc các mục từ list đầu vào, loại bỏ các đầu ra tương ứng.
List Comprehension với Biểu thức Điều kiện
Ví dụ: chỉ muốn các số nhỏ hơn 100, chia hết cho cả 2 và 5.
>>> lst = [x for x in range(100) if x % 2 == 0 if x % 5 == 0]
>>> print(lst)
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Ví dụ khác: chỉ tính bình phương của các số chia hết cho 2.
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> even_squares = [x**2 for x in lst if x % 2 == 0]
>>> print(even_squares)
[4, 16, 36, 64, 100]
Tính các số chẵn từ 1 đến 100.
>>> evens = [i for i in range(1,100) if not i % 2]
>>> print(evens)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
List comprehension nhanh hơn vòng lặp for đáng kể khi lặp qua số lượng lớn mục. Nếu tính dễ đọc chưa đủ thuyết phục, tốc độ sẽ là lý do để sử dụng chúng nhiều nhất có thể.