Danh sách hiểu trong Python là một cú pháp dễ dàng và nhỏ gọn để tạo danh sách từ một chuỗi hoặc danh sách khác. Đó là một cách rất ngắn gọn để tạo một danh sách mới bằng cách thực hiện một thao tác trên mỗi mục trong danh sách hiện có. Danh sách hiểu nhanh hơn đáng kể so với xử lý một danh sách bằng cách sử dụng vòng lặp.
[expression for element in iterable if condition]
Theo cú pháp trên, cú pháp hiểu biết danh sách chứa ba phần: một biểu thức, một hoặc nhiều cho vòng lặp và tùy chọn, một hoặc nhiều điều kiện nếu điều kiện. Danh sách hiểu phải nằm trong khung vuông even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 2. Kết quả của biểu thức đầu tiên sẽ được lưu trữ trong danh sách mới. Vòng lặp For được sử dụng để lặp lại trên đối tượng có thể tùy chọn bao gồm điều kiện if.
Giả sử chúng ta muốn tìm các số chẵn từ 0 đến 20 sau đó chúng ta có thể thực hiện nó bằng cách sử dụng một vòng lặp, như được hiển thị bên dưới:
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Kết quả tương tự có thể dễ dàng đạt được bằng cách sử dụng kỹ thuật hiểu danh sách dưới đây.
even_nums = [x for x in range(21) if x%2 == 0] print(even_nums)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Trong ví dụ trên, even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 3 trả về một danh sách mới bằng cách sử dụng danh sách hiểu. Đầu tiên, nó thực thi For Loop even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 4. Phần tử even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 5 sẽ được trả về nếu điều kiện được chỉ định even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 6 đánh giá là TRUE. Nếu điều kiện đánh giá là TRUE, thì biểu thức trước cho vòng lặp sẽ được thực thi và lưu trữ trong danh sách mới. Ở đây, biểu thức even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 5 chỉ đơn giản lưu trữ giá trị của even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 5 vào một danh sách mới.
Danh sách hiểu biết hoạt động với danh sách chuỗi cũng. Sau đây tạo ra một danh sách các chuỗi mới có chứa 'A'.
names = ['Steve', 'Bill', 'Ram', 'Mohan', 'Abdul'] names2 = [s for s in names if 'a' in s] print(names2)
Trên đây, biểu thức even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 9 trả về đúng nếu một phần tử chứa một ký tự 'A'. Vì vậy, danh sách mới sẽ bao gồm các tên có chứa 'A'.
Ví dụ sau đây sử dụng danh sách hiểu biết để xây dựng danh sách các bình phương của các số từ 1 đến 10.
squares = [x*x for x in range(11)] print(squares)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Ở trên, A cho Loop [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 0 được thực thi mà không có điều kiện nếu điều kiện. Biểu thức trước cho Loop [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 1 lưu trữ bình phương của phần tử trong danh sách mới.
Danh sách hiểu biết bằng cách sử dụng các vòng lặp lồng nhau
Có thể sử dụng các vòng lặp lồng nhau trong một biểu thức hiểu danh sách. Trong ví dụ sau, tất cả các kết hợp các mục từ hai danh sách dưới dạng một tuple được thêm vào trong một đối tượng danh sách thứ ba.
nums1 = [1, 2, 3] nums2 = [4, 5, 6] nums=[(x,y) for x in nums1 for y in nums2] print(nums)
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
Liệt kê sự hiểu biết với nhiều điều kiện nếu điều kiện
Chúng ta có thể sử dụng lồng nhau nếu các điều kiện với một danh sách hiểu.
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 0
Liệt kê sự hiểu biết với điều kiện IF-Else
Ví dụ sau đây cho thấy vòng lặp if..else với sự hiểu biết danh sách.
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 1
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 2
Danh sách phẳng bằng cách sử dụng danh sách hiểu
Một trong những ứng dụng của sự hiểu biết danh sách là làm phẳng danh sách bao gồm nhiều danh sách vào một danh sách duy nhất.
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 3
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 4
Tìm hiểu thêm về cách làm phẳng danh sách trong Python.
Danh sách hiểu so với vòng lặp trong Python
Giả sử, chúng tôi muốn tách các chữ cái của từ [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 2 và thêm các chữ cái làm mục của một danh sách. Điều đầu tiên xuất hiện trong tâm trí sẽ được sử dụng cho Loop.
Ví dụ 1: Lặp lại qua một chuỗi sử dụng cho vòng lặp
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 5Khi chúng tôi chạy chương trình, đầu ra sẽ là:
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 6Tuy nhiên, Python có một cách dễ dàng hơn để giải quyết vấn đề này bằng cách sử dụng danh sách hiểu. Danh sách hiểu là một cách thanh lịch để xác định và tạo danh sách dựa trên danh sách hiện có.
Hãy để xem cách chương trình trên có thể được viết bằng cách sử dụng toàn bộ danh sách.
Ví dụ 2: Lặp lại qua chuỗi bằng cách sử dụng danh sách hiểu
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 7Khi chúng tôi chạy chương trình, đầu ra sẽ là:
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 6Tuy nhiên, Python có một cách dễ dàng hơn để giải quyết vấn đề này bằng cách sử dụng danh sách hiểu. Danh sách hiểu là một cách thanh lịch để xác định và tạo danh sách dựa trên danh sách hiện có.
Hãy để xem cách chương trình trên có thể được viết bằng cách sử dụng toàn bộ danh sách.
even_nums = [] for x in range(21): if x%2 == 0: even_nums.append(x) print(even_nums) 9Ví dụ 2: Lặp lại qua chuỗi bằng cách sử dụng danh sách hiểu
Trong ví dụ trên, một danh sách mới được gán cho biến H_Letters và danh sách chứa các mục của chuỗi 'con người'. Chúng tôi gọi hàm [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 3 để nhận đầu ra.
Cú pháp của danh sách hiểu
Bây giờ chúng ta có thể xác định nơi sử dụng toàn bộ danh sách.
Nếu bạn nhận thấy, [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 2 là một chuỗi, không phải là một danh sách. Đây là sức mạnh của sự hiểu biết danh sách. Nó có thể xác định khi nào nó nhận được một chuỗi hoặc một tuple và hoạt động trên nó như một danh sách.
Bạn có thể làm điều đó bằng cách sử dụng các vòng lặp. Tuy nhiên, không phải mọi vòng lặp đều có thể được viết lại dưới dạng hiểu biết danh sách. Nhưng khi bạn học và cảm thấy thoải mái với các toàn bộ danh sách, bạn sẽ thấy mình thay thế ngày càng nhiều vòng lặp bằng cú pháp thanh lịch này.
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 0Liệt kê toàn diện so với các chức năng Lambda
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 1Danh sách toàn diện không phải là cách duy nhất để làm việc trong danh sách. Các chức năng tích hợp khác nhau và các chức năng Lambda có thể tạo và sửa đổi danh sách trong các dòng mã ít hơn.
Ví dụ 3: Sử dụng các hàm Lambda bên trong danh sách
Khi chúng tôi chạy chương trình, đầu ra sẽ
Tuy nhiên, sự hiểu biết danh sách thường dễ đọc của con người hơn các chức năng Lambda. Nó dễ dàng hơn để hiểu những gì lập trình viên đã cố gắng thực hiện khi sử dụng toàn bộ danh sách.
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 2Điều kiện trong danh sách hiểu
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 3Danh sách các hệ thống có thể sử dụng câu lệnh có điều kiện để sửa đổi danh sách hiện có (hoặc các bộ dữ liệu khác). Chúng tôi sẽ tạo danh sách sử dụng toán tử toán học, số nguyên và phạm vi ().
Ví dụ 4: Sử dụng nếu có danh sách hiểu
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 4Điều kiện trong danh sách hiểu
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 5Danh sách các hệ thống có thể sử dụng câu lệnh có điều kiện để sửa đổi danh sách hiện có (hoặc các bộ dữ liệu khác). Chúng tôi sẽ tạo danh sách sử dụng toán tử toán học, số nguyên và phạm vi ().
- Ví dụ 4: Sử dụng nếu có danh sách hiểu
- Khi chúng tôi chạy chương trình trên, đầu ra sẽ là:
Danh sách, number_list, sẽ được điền bởi các mục trong phạm vi từ 0-19 nếu giá trị của vật phẩm chia hết cho 2.
Ví dụ 5: Nested nếu có danh sách hiểu
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 6Điều kiện trong danh sách hiểu
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 7Danh sách các hệ thống có thể sử dụng câu lệnh có điều kiện để sửa đổi danh sách hiện có (hoặc các bộ dữ liệu khác). Chúng tôi sẽ tạo danh sách sử dụng toán tử toán học, số nguyên và phạm vi ().
Ví dụ 4: Sử dụng nếu có danh sách hiểu
Khi chúng tôi chạy chương trình trên, đầu ra sẽ là:
Danh sách, number_list, sẽ được điền bởi các mục trong phạm vi từ 0-19 nếu giá trị của vật phẩm chia hết cho 2.
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 8Ví dụ 5: Nested nếu có danh sách hiểu
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 9Ở đây, danh sách kiểm tra hiểu biết:
Y có phải chia cho 2 hay không?
Ví dụ 8: Chuyển đổi ma trận bằng cách sử dụng danh sách hiểu biết
even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 0Khi chúng tôi chạy chương trình trên, đầu ra sẽ là:
even_nums = [x for x in range(21) if x%2 == 0] print(even_nums) 1Trong chương trình trên, chúng tôi có một ma trận thay đổi có các hàng [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 7 và cột [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 8. Chúng tôi cần tìm sự chuyển đổi của ma trận. Đối với điều đó, chúng tôi đã sử dụng danh sách hiểu.
** Lưu ý: Các vòng lặp lồng nhau trong danh sách hiểu don don hoạt động như các vòng lặp lồng nhau thông thường. Trong chương trình trên, [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 9 được thực hiện trước names = ['Steve', 'Bill', 'Ram', 'Mohan', 'Abdul'] names2 = [s for s in names if 'a' in s] print(names2) 0. Do đó, lúc đầu, một giá trị được gán cho tôi sau đó mục được hướng bởi names = ['Steve', 'Bill', 'Ram', 'Mohan', 'Abdul'] names2 = [s for s in names if 'a' in s] print(names2) 1 được thêm vào trong biến chuyển vị. The nested loops in list comprehension don’t work like normal nested loops. In the above program, [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 9 is executed before names = ['Steve', 'Bill', 'Ram', 'Mohan', 'Abdul'] names2 = [s for s in names if 'a' in s] print(names2) 0. Hence at first, a value is assigned to i then item directed by names = ['Steve', 'Bill', 'Ram', 'Mohan', 'Abdul'] names2 = [s for s in names if 'a' in s] print(names2) 1 is appended in the transpose variable.
Những điểm chính cần nhớ
- Danh sách hiểu là một cách thanh lịch để xác định và tạo danh sách dựa trên danh sách hiện có.
- Danh sách hiểu thường nhỏ gọn và nhanh hơn các hàm và vòng lặp bình thường để tạo danh sách.
- Tuy nhiên, chúng ta nên tránh viết các toàn bộ danh sách rất dài trong một dòng để đảm bảo rằng mã thân thiện với người dùng.
- Hãy nhớ rằng, mọi danh sách hiểu có thể được viết lại cho Loop, nhưng mỗi vòng lặp đều có thể được viết lại dưới dạng danh sách hiểu.