Dictionary & Set Comprehension
1. Giới thiệu
Phần tiêu đề “1. Giới thiệu”Comprehension là cách viết ngắn gọn và dễ đọc để tạo Dictionary và Set từ một iterable (list, tuple, range, v.v.).
Lợi ích của Comprehension:
Phần tiêu đề “Lợi ích của Comprehension:”- ✅ Code ngắn gọn hơn
- ✅ Dễ đọc và dễ hiểu
- ✅ Thường nhanh hơn vòng lặp thông thường
- ✅ Pythonic (theo phong cách Python)
2. Dictionary Comprehension
Phần tiêu đề “2. Dictionary Comprehension”2.1 - Cú pháp cơ bản
Phần tiêu đề “2.1 - Cú pháp cơ bản”# Cú phápnew_dict = {key_expression: value_expression for item in iterable}2.2 - Ví dụ đơn giản
Phần tiêu đề “2.2 - Ví dụ đơn giản”# Tạo dictionary: số -> bình phươngsquares = {x: x**2 for x in range(1, 6)}print(squares)# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# Tạo dictionary từ hai listsnames = ["Alice", "Bob", "Charlie"]ages = [25, 30, 35]students = {name: age for name, age in zip(names, ages)}print(students)# {'Alice': 25, 'Bob': 30, 'Charlie': 35}2.3 - So sánh với vòng lặp thông thường
Phần tiêu đề “2.3 - So sánh với vòng lặp thông thường”# Cách 1: Vòng lặp thông thườngsquares = {}for x in range(1, 6): squares[x] = x**2
# Cách 2: Dictionary Comprehension (ngắn gọn hơn!)squares = {x: x**2 for x in range(1, 6)}3. Dictionary Comprehension với điều kiện
Phần tiêu đề “3. Dictionary Comprehension với điều kiện”3.1 - Thêm điều kiện if
Phần tiêu đề “3.1 - Thêm điều kiện if”# Chỉ lấy số chẵneven_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0}print(even_squares)# {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
# Lọc học sinh điểm caoscores = {"Alice": 85, "Bob": 60, "Charlie": 92, "David": 55}passed = {name: score for name, score in scores.items() if score >= 70}print(passed)# {'Alice': 85, 'Charlie': 92}3.2 - Điều kiện if-else
Phần tiêu đề “3.2 - Điều kiện if-else”# Phân loại số chẵn/lẻnumbers = {x: ("even" if x % 2 == 0 else "odd") for x in range(1, 6)}print(numbers)# {1: 'odd', 2: 'even', 3: 'odd', 4: 'even', 5: 'odd'}
# Chuyển đổi nhiệt độtemps_c = {"Ha Noi": 30, "Da Nang": 28, "TP HCM": 32}temps_f = {city: (temp * 9/5 + 32 if temp else 0) for city, temp in temps_c.items()}print(temps_f)# {'Ha Noi': 86.0, 'Da Nang': 82.4, 'TP HCM': 89.6}4. Ví dụ thực tế với Dictionary Comprehension
Phần tiêu đề “4. Ví dụ thực tế với Dictionary Comprehension”Ví dụ 1: Đếm ký tự trong chuỗi
Phần tiêu đề “Ví dụ 1: Đếm ký tự trong chuỗi”text = "hello"char_count = {char: text.count(char) for char in text}print(char_count)# {'h': 1, 'e': 1, 'l': 2, 'o': 1}Ví dụ 2: Đảo ngược dictionary
Phần tiêu đề “Ví dụ 2: Đảo ngược dictionary”original = {"a": 1, "b": 2, "c": 3}reversed_dict = {value: key for key, value in original.items()}print(reversed_dict)# {1: 'a', 2: 'b', 3: 'c'}Ví dụ 3: Chuyển đổi list thành lookup dictionary
Phần tiêu đề “Ví dụ 3: Chuyển đổi list thành lookup dictionary”fruits = ["apple", "banana", "cherry"]fruit_index = {fruit: index for index, fruit in enumerate(fruits)}print(fruit_index)# {'apple': 0, 'banana': 1, 'cherry': 2}Ví dụ 4: Tạo dictionary từ list với điều kiện
Phần tiêu đề “Ví dụ 4: Tạo dictionary từ list với điều kiện”words = ["apple", "banana", "kiwi", "cherry", "date"]long_words = {word: len(word) for word in words if len(word) > 5}print(long_words)# {'banana': 6, 'cherry': 6}5. Nested Dictionary Comprehension
Phần tiêu đề “5. Nested Dictionary Comprehension”5.1 - Comprehension lồng nhau
Phần tiêu đề “5.1 - Comprehension lồng nhau”# Tạo bảng cửu chươngmultiplication_table = { x: {y: x*y for y in range(1, 6)} for x in range(1, 6)}print(multiplication_table)# {# 1: {1: 1, 2: 2, 3: 3, 4: 4, 5: 5},# 2: {1: 2, 2: 4, 3: 6, 4: 8, 5: 10},# ...# }5.2 - Flatten nested dictionary
Phần tiêu đề “5.2 - Flatten nested dictionary”nested = {"a": {"x": 1, "y": 2}, "b": {"x": 3, "y": 4}}flat = {f"{k1}_{k2}": v for k1, d in nested.items() for k2, v in d.items()}print(flat)# {'a_x': 1, 'a_y': 2, 'b_x': 3, 'b_y': 4}6. Set Comprehension
Phần tiêu đề “6. Set Comprehension”6.1 - Cú pháp cơ bản
Phần tiêu đề “6.1 - Cú pháp cơ bản”# Cú phápnew_set = {expression for item in iterable}Lưu ý: Set tự động loại bỏ phần tử trùng lặp!
6.2 - Ví dụ đơn giản
Phần tiêu đề “6.2 - Ví dụ đơn giản”# Tạo set các số bình phươngsquares = {x**2 for x in range(1, 6)}print(squares)# {1, 4, 9, 16, 25}
# Loại bỏ trùng lặpnumbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]unique = {x for x in numbers}print(unique)# {1, 2, 3, 4}6.3 - So sánh với vòng lặp thông thường
Phần tiêu đề “6.3 - So sánh với vòng lặp thông thường”# Cách 1: Vòng lặp thông thườngsquares = set()for x in range(1, 6): squares.add(x**2)
# Cách 2: Set Comprehension (ngắn gọn hơn!)squares = {x**2 for x in range(1, 6)}7. Set Comprehension với điều kiện
Phần tiêu đề “7. Set Comprehension với điều kiện”7.1 - Thêm điều kiện if
Phần tiêu đề “7.1 - Thêm điều kiện if”# Chỉ lấy số chẵneven_numbers = {x for x in range(1, 11) if x % 2 == 0}print(even_numbers)# {2, 4, 6, 8, 10}
# Lọc từ dài hơn 4 ký tựwords = ["cat", "dog", "elephant", "lion", "tiger"]long_words = {word for word in words if len(word) > 4}print(long_words)# {'elephant', 'tiger'}7.2 - Điều kiện if-else
Phần tiêu đề “7.2 - Điều kiện if-else”# Chuyển đổi: số chẵn thành "even", số lẻ thành "odd"types = {"even" if x % 2 == 0 else "odd" for x in range(1, 6)}print(types)# {'odd', 'even'} # Chỉ 2 phần tử vì set loại trùng lặp!8. Ví dụ thực tế với Set Comprehension
Phần tiêu đề “8. Ví dụ thực tế với Set Comprehension”Ví dụ 1: Lấy các ký tự unique trong chuỗi
Phần tiêu đề “Ví dụ 1: Lấy các ký tự unique trong chuỗi”text = "hello world"unique_chars = {char for char in text if char != " "}print(unique_chars)# {'h', 'e', 'l', 'o', 'w', 'r', 'd'}Ví dụ 2: Lấy phần tử chung của nhiều lists
Phần tiêu đề “Ví dụ 2: Lấy phần tử chung của nhiều lists”list1 = [1, 2, 3, 4, 5]list2 = [4, 5, 6, 7, 8]common = {x for x in list1 if x in list2}print(common)# {4, 5}Ví dụ 3: Tạo set các số chia hết cho 3 hoặc 5
Phần tiêu đề “Ví dụ 3: Tạo set các số chia hết cho 3 hoặc 5”divisible = {x for x in range(1, 31) if x % 3 == 0 or x % 5 == 0}print(divisible)# {3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24, 25, 27, 30}Ví dụ 4: Tìm các từ xuất hiện trong cả hai văn bản
Phần tiêu đề “Ví dụ 4: Tìm các từ xuất hiện trong cả hai văn bản”text1 = "Python is awesome and powerful"text2 = "Python is easy and fun"words1 = set(text1.lower().split())words2 = set(text2.lower().split())common_words = {word for word in words1 if word in words2}print(common_words)# {'python', 'is', 'and'}9. Nested Set Comprehension
Phần tiêu đề “9. Nested Set Comprehension”# Lấy tất cả các số từ nested listsnested_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]all_numbers = {num for sublist in nested_lists for num in sublist}print(all_numbers)# {1, 2, 3, 4, 5, 6, 7, 8, 9}
# Lấy các số chẵn từ nested listseven_numbers = {num for sublist in nested_lists for num in sublist if num % 2 == 0}print(even_numbers)# {2, 4, 6, 8}10. So sánh Dictionary vs Set Comprehension
Phần tiêu đề “10. So sánh Dictionary vs Set Comprehension”| Đặc điểm | Dictionary Comprehension | Set Comprehension |
|---|---|---|
| Cú pháp | {k: v for ...} |
{x for ...} |
| Kết quả | Dictionary (key-value) | Set (unique values) |
| Trùng lặp | Key trùng thì ghi đè | Tự động loại bỏ |
| Thứ tự | Giữ thứ tự (Python 3.7+) | Không có thứ tự |
| Sử dụng | Mapping, lookup | Unique values, set operations |
11. Tips và Best Practices
Phần tiêu đề “11. Tips và Best Practices”1. Khi nào nên dùng?
Phần tiêu đề “1. Khi nào nên dùng?”# TỐT - Đơn giản, dễ đọcsquares = {x: x**2 for x in range(5)}
# TRÁNH - Quá phức tạp, khó đọccomplex = { x: y**2 + z**3 for x in range(10) for y in range(10) for z in range(10) if x > 5 and y < 3 and z % 2 == 0}# Nên dùng vòng lặp thông thường cho trường hợp này!2. Đặt tên rõ ràng
Phần tiêu đề “2. Đặt tên rõ ràng”# TỐTstudent_grades = {name: score for name, score in zip(names, scores)}
# TRÁNHd = {n: s for n, s in zip(names, scores)} # Tên biến không rõ ràng3. Giữ cho đơn giản
Phần tiêu đề “3. Giữ cho đơn giản”# TỐT - Một điều kiện đơn giảneven_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# TRÁNH - Nhiều điều kiện phức tạp# Nên dùng function hoặc vòng lặp thông thườngcomplex = { x: compute(x) for x in data if condition1(x) and condition2(x) or condition3(x)}4. Cẩn thận với nested comprehension
Phần tiêu đề “4. Cẩn thận với nested comprehension”# TỐT - Flatten đơn giảnflat = {item for sublist in nested for item in sublist}
# TRÁNH - Quá nhiều lồng nhauvery_nested = { x: { y: {z: x*y*z for z in range(5)} for y in range(5) } for x in range(5)}# Khó đọc! Nên tách thành nhiều bước12. Ví dụ tổng hợp
Phần tiêu đề “12. Ví dụ tổng hợp”Ví dụ 1: Quản lý điểm học sinh
Phần tiêu đề “Ví dụ 1: Quản lý điểm học sinh”students = ["Alice", "Bob", "Charlie", "David", "Eve"]scores = [85, 92, 78, 95, 88]
# Tạo dictionary điểmgrade_dict = {name: score for name, score in zip(students, scores)}print(grade_dict)
# Lọc học sinh đạt từ 80 trở lênexcellent = {name: score for name, score in grade_dict.items() if score >= 80}print(excellent)# {'Alice': 85, 'Bob': 92, 'David': 95, 'Eve': 88}
# Tạo set tên học sinh đạt điểm caotop_students = {name for name, score in grade_dict.items() if score >= 90}print(top_students)# {'Bob', 'David'}Ví dụ 2: Phân tích văn bản
Phần tiêu đề “Ví dụ 2: Phân tích văn bản”text = "Python is powerful and Python is easy to learn"words = text.lower().split()
# Đếm số lần xuất hiện của mỗi từword_count = {word: words.count(word) for word in set(words)}print(word_count)# {'python': 2, 'is': 2, 'powerful': 1, 'and': 1, 'easy': 1, 'to': 1, 'learn': 1}
# Lấy các từ unique (không trùng)unique_words = {word for word in words}print(unique_words)# {'python', 'is', 'powerful', 'and', 'easy', 'to', 'learn'}
# Lấy các từ dài hơn 4 ký tựlong_words = {word for word in words if len(word) > 4}print(long_words)# {'python', 'powerful', 'learn'}Ví dụ 3: Chuyển đổi dữ liệu
Phần tiêu đề “Ví dụ 3: Chuyển đổi dữ liệu”# Dữ liệu gốcproducts = [ ("Laptop", 1000), ("Mouse", 20), ("Keyboard", 50), ("Monitor", 300)]
# Tạo dictionary giáprices = {name: price for name, price in products}print(prices)
# Áp dụng giảm giá 10%discounted = {name: price * 0.9 for name, price in prices.items()}print(discounted)# {'Laptop': 900.0, 'Mouse': 18.0, 'Keyboard': 45.0, 'Monitor': 270.0}
# Lấy sản phẩm đắt tiền (> 100)expensive = {name for name, price in prices.items() if price > 100}print(expensive)# {'Laptop', 'Monitor'}Bài giảng trên YouTube
Phần tiêu đề “Bài giảng trên YouTube”Cập nhật sau
📝 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: