List Comprehension
List comprehension là một trong những tính năng mạnh mẽ nhất của Python, giúp bạn tạo list mới từ các iterable một cách ngắn gọn và dễ đọc.
List Comprehension là gì?
Phần tiêu đề “List Comprehension là gì?”List comprehension là cú pháp đặc biệt trong Python cho phép tạo list mới bằng cách áp dụng một biểu thức cho mỗi phần tử trong một iterable (list, tuple, string, v.v.), thường kết hợp với điều kiện lọc.
Cú pháp cơ bản:
[biểu_thức for phần_tử in iterable]Cú pháp với điều kiện:
[biểu_thức for phần_tử in iterable if điều_kiện]Tại sao nên sử dụng List Comprehension?
Phần tiêu đề “Tại sao nên sử dụng List Comprehension?”1. Code ngắn gọn hơn
Phần tiêu đề “1. Code ngắn gọn hơn”Cách truyền thống:
squares = []for x in range(10): squares.append(x**2)print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Với list comprehension:
squares = [x**2 for x in range(10)]print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]2. Hiệu suất tốt hơn
Phần tiêu đề “2. Hiệu suất tốt hơn”List comprehension thường chạy nhanh hơn vòng lặp for truyền thống vì được tối ưu hóa ở mức C trong CPython.
3. Dễ đọc và Pythonic
Phần tiêu đề “3. Dễ đọc và Pythonic”Code sử dụng list comprehension thường được coi là “Pythonic” hơn - phong cách lập trình được cộng đồng Python khuyến khích.
Các ví dụ cụ thể
Phần tiêu đề “Các ví dụ cụ thể”Ví dụ 1: Chuyển đổi dữ liệu đơn giản
Phần tiêu đề “Ví dụ 1: Chuyển đổi dữ liệu đơn giản”# Chuyển đổi danh sách số thành bình phươngnumbers = [1, 2, 3, 4, 5]squares = [n**2 for n in numbers]print(squares) # [1, 4, 9, 16, 25]
# Chuyển đổi chuỗi thành chữ hoawords = ['hello', 'world', 'python']uppercase = [word.upper() for word in words]print(uppercase) # ['HELLO', 'WORLD', 'PYTHON']
# Lấy độ dài của mỗi từlengths = [len(word) for word in words]print(lengths) # [5, 5, 6]Ví dụ 2: Sử dụng điều kiện lọc (if)
Phần tiêu đề “Ví dụ 2: Sử dụng điều kiện lọc (if)”# Lọc số chẵnnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]evens = [n for n in numbers if n % 2 == 0]print(evens) # [2, 4, 6, 8, 10]
# Lọc số dươngmixed_numbers = [-3, -1, 0, 2, 5, -7, 8]positives = [n for n in mixed_numbers if n > 0]print(positives) # [2, 5, 8]
# Lọc từ có độ dài > 4words = ['cat', 'hello', 'dog', 'python', 'ai']long_words = [word for word in words if len(word) > 4]print(long_words) # ['hello', 'python']Ví dụ 3: Kết hợp điều kiện và biến đổi
Phần tiêu đề “Ví dụ 3: Kết hợp điều kiện và biến đổi”# Bình phương các số chẵnnumbers = [1, 2, 3, 4, 5, 6]even_squares = [n**2 for n in numbers if n % 2 == 0]print(even_squares) # [4, 16, 36]
# Chuyển các số âm thành dươngnumbers = [-5, 3, -2, 8, -1]absolute_negatives = [abs(n) for n in numbers if n < 0]print(absolute_negatives) # [5, 2, 1]Ví dụ 4: If-else trong List Comprehension
Phần tiêu đề “Ví dụ 4: If-else trong List Comprehension”# Phân loại số chẵn/lẻnumbers = [1, 2, 3, 4, 5]labels = ['even' if n % 2 == 0 else 'odd' for n in numbers]print(labels) # ['odd', 'even', 'odd', 'even', 'odd']
# Thay thế số âm bằng 0numbers = [-3, 5, -1, 8, -2]non_negative = [n if n >= 0 else 0 for n in numbers]print(non_negative) # [0, 5, 0, 8, 0]
# Chuẩn hóa điểm sốscores = [45, 78, 92, 35, 88]passed = ['Pass' if score >= 50 else 'Fail' for score in scores]print(passed) # ['Fail', 'Pass', 'Pass', 'Fail', 'Pass']Ví dụ 5: Nested List Comprehension (Lồng nhau)
Phần tiêu đề “Ví dụ 5: Nested List Comprehension (Lồng nhau)”# Tạo ma trận 3x3matrix = [[i*3 + j for j in range(3)] for i in range(3)]print(matrix)# [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
# Làm phẳng (flatten) ma trậnmatrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]flattened = [num for row in matrix for num in row]print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Tạo tất cả các cặp có thểcolors = ['red', 'green', 'blue']sizes = ['S', 'M', 'L']combinations = [(color, size) for color in colors for size in sizes]print(combinations)# [('red', 'S'), ('red', 'M'), ('red', 'L'),# ('green', 'S'), ('green', 'M'), ('green', 'L'),# ('blue', 'S'), ('blue', 'M'), ('blue', 'L')]Ví dụ 6: Xử lý chuỗi
Phần tiêu đề “Ví dụ 6: Xử lý chuỗi”# Lọc nguyên âm từ chuỗisentence = "Hello World"vowels = [char for char in sentence if char.lower() in 'aeiou']print(vowels) # ['e', 'o', 'o']
# Tách và làm sạch dữ liệuraw_data = " apple, banana, orange "cleaned = [item.strip() for item in raw_data.split(',')]print(cleaned) # ['apple', 'banana', 'orange']
# Đếm ký tự trong mỗi từwords = ['python', 'list', 'comprehension']char_counts = [(word, len(word)) for word in words]print(char_counts) # [('python', 6), ('list', 4), ('comprehension', 13)]Ví dụ 7: Làm việc với dictionary
Phần tiêu đề “Ví dụ 7: Làm việc với dictionary”# Tạo dictionary từ hai listkeys = ['name', 'age', 'city']values = ['Alice', 25, 'Hanoi']person = {k: v for k, v in zip(keys, values)}print(person) # {'name': 'Alice', 'age': 25, 'city': 'Hanoi'}
# Lọc dictionaryscores = {'Alice': 85, 'Bob': 72, 'Charlie': 90, 'David': 65}high_scorers = {name: score for name, score in scores.items() if score >= 80}print(high_scorers) # {'Alice': 85, 'Charlie': 90}
# Đảo ngược key-valueoriginal = {'a': 1, 'b': 2, 'c': 3}reversed_dict = {v: k for k, v in original.items()}print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}Ví dụ 8: Ứng dụng thực tế
Phần tiêu đề “Ví dụ 8: Ứng dụng thực tế”Xử lý dữ liệu sinh viên:
students = [ {'name': 'An', 'score': 85}, {'name': 'Binh', 'score': 72}, {'name': 'Chi', 'score': 90}, {'name': 'Dung', 'score': 65}]
# Lấy tên các sinh viên đạt điểm caohigh_achievers = [s['name'] for s in students if s['score'] >= 80]print(high_achievers) # ['An', 'Chi']
# Tính điểm trung bình cộngavg_score = sum([s['score'] for s in students]) / len(students)print(f"Điểm trung bình: {avg_score}") # Điểm trung bình: 78.0Xử lý file CSV:
# Giả sử đọc từ file CSVdata = [ "Name,Age,City", "Alice,25,Hanoi", "Bob,30,HCM", "Charlie,35,Danang"]
# Parse dữ liệu (bỏ header)parsed = [line.split(',') for line in data[1:]]print(parsed)# [['Alice', '25', 'Hanoi'], ['Bob', '30', 'HCM'], ['Charlie', '35', 'Danang']]
# Lấy chỉ tên và tuổinames_ages = [(row[0], int(row[1])) for row in parsed]print(names_ages)# [('Alice', 25), ('Bob', 30), ('Charlie', 35)]Lưu ý khi sử dụng List Comprehension
Phần tiêu đề “Lưu ý khi sử dụng List Comprehension”1. Đừng lạm dụng
Phần tiêu đề “1. Đừng lạm dụng”List comprehension phức tạp có thể làm code khó đọc:
# Khó đọcresult = [[x*y for y in range(5) if y % 2 == 0] for x in range(10) if x % 3 == 0]
# Tốt hơn: Sử dụng vòng lặp thông thườngresult = []for x in range(10): if x % 3 == 0: row = [] for y in range(5): if y % 2 == 0: row.append(x * y) result.append(row)2. Cân nhắc về bộ nhớ
Phần tiêu đề “2. Cân nhắc về bộ nhớ”List comprehension tạo toàn bộ list trong bộ nhớ. Với dataset lớn, hãy xem xét sử dụng generator expression:
# List comprehension - tạo toàn bộ listsquares_list = [x**2 for x in range(1000000)]
# Generator expression - tạo từng phần tử khi cầnsquares_gen = (x**2 for x in range(1000000))3. Không nên có side effects
Phần tiêu đề “3. Không nên có side effects”# Không nênresults = [print(x) for x in range(5)] # Sử dụng print trong comprehension
# Nênfor x in range(5): print(x)So sánh với các phương pháp khác
Phần tiêu đề “So sánh với các phương pháp khác”numbers = range(10)
# List comprehensionsquares1 = [x**2 for x in numbers]
# map() với lambdasquares2 = list(map(lambda x: x**2, numbers))
# Vòng lặp forsquares3 = []for x in numbers: squares3.append(x**2)
# Cả 3 đều cho kết quả giống nhauprint(squares1 == squares2 == squares3) # TrueKết luận
Phần tiêu đề “Kết luận”List comprehension là công cụ mạnh mẽ giúp code Python của bạn ngắn gọn, dễ đọc và hiệu quả hơn. Tuy nhiên, hãy sử dụng chúng một cách hợp lý - khi list comprehension trở nên quá phức tạp, đừng ngần ngại quay lại sử dụng vòng lặp for truyền thống để code dễ hiểu hơn.
Hãy thực hành với các ví dụ trên và dần dần list comprehension sẽ trở thành một phần tự nhiên trong cách viết code Python của bạn!
📝 Bài tập thực hành
Phần tiêu đề “📝 Bài tập thực hành”Sau khi học xong bài này, hãy thực hành với các bài tập sau: