Thứ năm, 12/01/2017 | 00:00 GMT+7

Hiểu toàn bộ danh sách trong Python 3

Danh sách hiểu cung cấp một cách ngắn gọn để tạo danh sách dựa trên danh sách hiện có. Khi sử dụng tính năng hiểu danh sách, danh sách có thể được tạo bằng cách tận dụng bất kỳ khả năng lặp lại nào, bao gồm chuỗibộ giá trị .

Về mặt cú pháp, danh sách dễ hiểu bao gồm một có thể lặp lại chứa một biểu thức theo sau là mệnh đề for . Tiếp theo là mệnh đề bổ sung for hoặc if , vì vậy việc làm quen với vòng lặp forcâu lệnh điều kiện sẽ giúp bạn hiểu rõ hơn về danh sách.

Phần hiểu danh sách cung cấp một cú pháp thay thế để tạo danh sách và các kiểu dữ liệu tuần tự khác . Trong khi các phương pháp lặp khác, chẳng hạn như vòng lặp for , cũng được dùng để tạo danh sách, thì việc hiểu danh sách có thể được ưu tiên hơn vì chúng có thể giới hạn số dòng được sử dụng trong chương trình của bạn.

Liệt kê toàn bộ

Trong Python, các phần hiểu danh sách được xây dựng như vậy:

list_variable = [x for x in iterable] 

Một danh sách hoặc có thể lặp lại khác được gán cho một biến. Các biến bổ sung đại diện cho các mục bên trong có thể lặp lại được xây dựng xung quanh mệnh đề for . Các in từ khóa được sử dụng vì nó là trong for vòng, để lặp qua các iterable .

Hãy xem một ví dụ tạo danh sách dựa trên một chuỗi:

shark_letters = [letter for letter in 'shark'] print(shark_letters) 

Ở đây, danh sách mới được gán cho biến shark_lettersletter được sử dụng để đại diện cho các mục có trong chuỗi có thể lặp lại 'shark' .

Để ta xác nhận danh sách shark_letters trông như thế nào, ta yêu cầu nó print() và nhận kết quả sau:

Output
['s', 'h', 'a', 'r', 'k']

Danh sách ta đã tạo với khả năng hiểu danh sách bao gồm các mục trong chuỗi 'shark' , nghĩa là, một chuỗi cho mỗi chữ cái.

Phần hiểu danh sách có thể được viết lại như vòng lặp for , mặc dù không phải mọi vòng lặp for đều có thể được viết lại như một phần hiểu danh sách.

Sử dụng khả năng hiểu danh sách của ta đã tạo danh sách shark_letters ở trên, hãy viết lại nó dưới dạng vòng lặp for . Điều này có thể giúp ta hiểu rõ hơn về cách thức hoạt động của tính năng hiểu danh sách.

shark_letters = []  for letter in 'shark':     shark_letters.append(letter)  print(shark_letters) 

Khi tạo danh sách với vòng lặp for , biến được gán cho danh sách cần được khởi tạo với danh sách trống, vì nó nằm ở dòng đầu tiên của khối mã của ta . Sau đó, vòng lặp for sẽ lặp lại mục, sử dụng letter biến trong chuỗi có thể lặp lại 'shark' . Trong vòng lặp for , mỗi mục trong chuỗi được thêm vào danh sách bằng phương thức list.append(x) .

Viết lại cách hiểu danh sách dưới dạng vòng lặp for cung cấp cho ta cùng một kết quả:

Output
['s', 'h', 'a', 'r', 'k']

Phần hiểu danh sách có thể được viết lại như vòng lặp for và một số vòng lặp for có thể được viết lại thành phần hiểu danh sách để làm cho mã ngắn gọn hơn.

Sử dụng các Điều kiện với Toàn bộ Danh sách

Phần hiểu danh sách có thể sử dụng các câu lệnh có điều kiện để sửa đổi danh sách hiện có hoặc các kiểu dữ liệu tuần tự khác khi tạo danh sách mới.

Hãy xem xét một ví dụ của một if tuyên bố sử dụng trong một sự hiểu biết danh sách:

fish_tuple = ('blowfish', 'clownfish', 'catfish', 'octopus')  fish_list = [fish for fish in fish_tuple if fish != 'octopus'] print(fish_list) 

Khả năng hiểu danh sách sử dụng tuple fish_tuple làm cơ sở cho danh sách mới được gọi là fish_list . Các từ khóa của forin được sử dụng, như trong các phần trên , và bây giờ một if tuyên bố được thêm vào. Các if tuyên bố cho biết chỉ thêm những mặt hàng mà không phải là tương đương với chuỗi 'octopus' , vì vậy danh sách mới chỉ mất trong các mục từ tuple không phù hợp 'octopus' .

Khi ta chạy điều này, ta sẽ thấy rằng fish_list chứa các mục chuỗi giống như fish_tuple ngoại trừ thực tế là chuỗi 'octopus' đã bị bỏ qua:

Output
['blowfish', 'clownfish', 'catfish']

Do đó, danh sách mới của ta có mọi mục của bộ nguyên root ngoại trừ chuỗi bị loại trừ bởi câu lệnh điều kiện.

Ta sẽ tạo một ví dụ khác sử dụng toán tử toán học , số nguyênkiểu trình tự range() .

number_list = [x ** 2 for x in range(10) if x % 2 == 0] print(number_list) 

Danh sách đang được tạo, number_list , sẽ được điền các giá trị bình phương của mỗi mục trong phạm vi từ 0-9 nếu giá trị của mục đó chia hết cho 2. Kết quả như sau:

Output
[0, 4, 16, 36, 64]

Để phân tích những gì mà tính năng hiểu danh sách đang làm, ta hãy nghĩ về những gì sẽ được in ra nếu ta chỉ gọi x for x in range(10) . Chương trình nhỏ và kết quả của ta sau đó sẽ giống như sau:

number_list = [x for x in range(10)] print(number_list) 
Output
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bây giờ, hãy thêm câu lệnh điều kiện:

number_list = [x for x in range(10) if x % 2 == 0] print(number_list) 
Output
[0, 2, 4, 6, 8]

Các if tuyên bố đã giới hạn các mục trong danh sách cuối cùng để chỉ bao gồm những mặt hàng có chia hết cho 2, bỏ qua tất cả các số lẻ.

Cuối cùng, ta có thể thêm toán tử để mỗi x bình phương:

number_list = [x ** 2 for x in range(10) if x % 2 == 0] print(number_list) 

Vì vậy, mỗi số trong danh sách trước đó của [0, 2, 4, 6, 8] bây giờ là bình phương:

Output
[0, 4, 16, 36, 64]

Bạn cũng có thể sao chép các câu lệnh if lồng nhau với khả năng hiểu danh sách:

number_list = [x for x in range(100) if x % 3 == 0 if x % 5 == 0] print(number_list) 

Ở đây, phần hiểu danh sách trước tiên sẽ kiểm tra xem số x có chia hết cho 3 hay không, sau đó kiểm tra xem x có chia hết cho 5. Nếu x thỏa mãn cả hai yêu cầu, nó sẽ in ra và kết quả là:

Output
[0, 15, 30, 45, 60, 75, 90]

Có điều kiện if báo cáo được dùng để kiểm soát các mục từ một chuỗi hiện có trong việc tạo ra một danh sách mới.

Các vòng lặp lồng nhau trong việc hiểu danh sách

Các vòng lặp lồng nhau được dùng để thực hiện nhiều lần lặp trong chương trình của ta .

Lần này, ta sẽ xem xét một hiện có lồng for xây dựng vòng lặp và làm việc theo cách của ta hướng tới một sự hiểu biết danh sách.

Mã của ta sẽ tạo một danh sách mới lặp qua 2 danh sách và thực hiện các phép toán dựa trên chúng. Đây là khối mã vòng lặp for lồng nhau của ta :

my_list = []  for x in [20, 40, 60]:     for y in [2, 4, 6]:         my_list.append(x * y)  print(my_list) 

Khi ta chạy mã này, ta nhận được kết quả sau:

Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

Mã này đang nhân các mục trong danh sách đầu tiên với các mục trong danh sách thứ hai qua mỗi lần lặp.

Để biến điều này thành một danh sách dễ hiểu, ta sẽ cô đọng từng dòng mã thành một dòng, bắt đầu bằng phép toán x * y . Tiếp theo là vòng lặp for bên ngoài, sau đó là vòng lặp for bên trong. Ta sẽ thêm câu print() bên dưới phần hiểu danh sách của ta để xác nhận danh sách mới trùng với danh sách ta đã tạo với khối vòng lặp for lồng nhau ở trên:

my_list = [x * y for x in [20, 40, 60] for y in [2, 4, 6]] print(my_list) 
Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

my_list năng hiểu danh sách của ta lấy các vòng lặp for lồng nhau và làm phẳng chúng thành một dòng mã trong khi vẫn tạo cùng một danh sách chính xác để gán cho biến my_list .

Khả năng hiểu danh sách cung cấp cho ta cách lập danh sách ngắn gọn, cho phép ta tách một số dòng mã thành một dòng duy nhất. Tuy nhiên, cần lưu ý tính dễ đọc của mã của ta phải luôn được ưu tiên, vì vậy khi một dòng hiểu danh sách trở nên quá dài hoặc khó sử dụng, tốt nhất có thể chia nó thành nhiều vòng.

Kết luận

Khả năng hiểu danh sách cho phép ta chuyển đổi một danh sách hoặc chuỗi khác thành một danh sách mới. Chúng cung cấp một cú pháp ngắn gọn để hoàn thành nhiệm vụ này, hạn chế các dòng mã của ta .

Danh sách hiểu được tuân theo dạng toán học của ký hiệu trình xây dựng tập hợp hoặc hiểu tập hợp, vì vậy chúng có thể đặc biệt trực quan đối với các lập trình viên có nền tảng toán học.

Mặc dù việc hiểu danh sách có thể làm cho mã của ta ngắn gọn hơn, nhưng điều quan trọng là phải đảm bảo mã cuối cùng của ta dễ đọc nhất có thể, vì vậy nên tránh những dòng mã rất dài đảm bảo rằng mã của ta thân thiện với user .


Tags:

Các tin liên quan

Cách tạo các vòng lặp trong Python 3
2017-01-12
Cách sử dụng các câu lệnh Break, Continue và Pass khi làm việc với các vòng lặp trong Python 3
2017-01-06
Cách tạo vòng lặp While trong Python 3
2017-01-05
Cách làm việc với dữ liệu ngôn ngữ trong Python 3 bằng Bộ công cụ ngôn ngữ tự nhiên (NLTK)
2017-01-03
Cách tạo Twitterbot bằng Python 3 và Thư viện Tweepy
2016-11-30
Cách tạo ứng dụng Twitter bằng Python
2016-11-23
Cách tạo ứng dụng Twitter bằng Python
2016-11-23
Hiểu Logic Boolean trong Python 3
2016-11-17
Cách tạo chương trình máy tính bằng Python 3
2016-11-16
Cách tạo chương trình máy tính bằng Python 3
2016-11-16