Hướng dẫn python list comprehension index

List comprehensions cung cấp một cách ngắn gọn để tạo một danh sách mới. Nó bao gồm dấu ngoặc chứa một biểu thức theo sau nó là một mệnh đề. Các biểu thức có thể là bất cứ điều gì. Kết quả sẽ trả lại một List mới dựa trên đánh giá của mệnh đề trong đó. List comprehensions luôn trả về một danh sách kết quả.

Nội dung chính

  • Sử dụng list comprehensions thay cho map và filter
  • List comprehension trong Python là gì
  • Sử dụng list comprehension để tạo list trong Python
  • Cú pháp list comprehension trong python
  • Ví dụ cụ thể về sử dụng list comprehension trong python
  • Sử dụng hàm tự tạo trong List comprehension python
  • Sử dụng list comprehension trong Python kèm với hàm IF
  • Tổng kết và thực hành

Nếu như chúng ta hay sử dụng như thế này:

new_list = []
for i in old_list:
    if filter(i):
        new_list.append(expressions(i))

Thì chúng ta có thể viết lại ngắn gọn như thế này:

new_list = [expression(i) for i in old_list if filter(i)]

Cú pháp

Cú pháp cơ bản tạo 1 list :

[ expression for item in list if conditional ]

Cú pháp ở trên tương đương:

for item in list:
    if conditional:
        expression

chúng ta có thể tạo set hoặc dict:

{ expression for item in list if conditional }

Ví dụ

Để tạo một list gồm các số từ 1 tới 10 chúng ta thường làm:

lst = []
for i in range(1,11):
	lst.append(i)

print(lst)
[1,2,3,4,5,6,7,8,9,10]

Nếu sử dụng list comprehensions thì công việc rất ngắn gọn:

lst = [i for i in range(1, 11)]

print(lst)
[1,2,3,4,5,6,7,8,9,10]

Sử dụng list comprehensions thay cho map và filter

Nếu như chúng ta chỉ sử dụng một đối số thì list comprehensions sẽ dễ hiểu hơn là chúng ta sử dụng map. Thông thường khi sử dụng map trong python chúng ta thường sử dụng kèm với lambda.

>>> a=  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> squares= map(lambda x: x**2, a)
>>> list(squares)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

nếu sử dụng list comprehensions:

>>> a=  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> even_squares=[x**2 for x in a]
>>> even_squares
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

rõ ràng khi nhìn vào 2 biểu thức trên thì ta sẽ thấy sử dụng list comprehensions với 1 tham số sẽ dễ hiểu hơn dùng map.

Filter buil-in function có thể được sử dụng kèm với map. FIlter sẽ trả về một danh sách kết quả với các điều kiện là true.

>>> alt	= map(lambda x:	x**2, filter(lambda	x: x%2==0, a))
>>> list(alt)
[4, 16, 36, 64, 100]

Nhưng khi nhiều vào khối lệnh trên thì nó sẽ rất lằng nhằng và khó đọc. Thay vào đó sử dụng list comprehensions sẽ rất dễ dàng và dễ hiểu:

>>> even_squares =[x**2 for x in a if x%2==0]
>>> even_squares
[4, 16, 36, 64, 100]

Note

List comprehensions cũng hỗ trợ nhiều cấp và điều kiện ở mỗi cấp. Tuy nhiên, chúng ta cũng chỉ nên sử dụng nó ở 2 cấp. Việc sử dụng lồng nhiều cấp độ cũng gây ra tình trạng khó đọc. Chúng ta nên tránh điều đó.

Conclusion

Trên đây là mình đã giới thiệu cách sử dụng List comprehensions trong python. Việc sử dụng nó sẽ giúp code nhìn trông sáng sủa hơn, dễ đọc hơn. Nhưng cũng tránh một số trường hợp. Cái này làm nhiều chũng ta sẽ rút được ra kinh nghiệm. Cảm ơn đã đọc bài.

Tham khảo:

effective python

https://www.pythonforbeginners.com/basics/list-comprehensions-in-python

Hướng dẫn cách sử dụng List comprehension trong Python. Bạn sẽ học được khái niệm List comprehension trong Python là gì cũng như cách sử dụng List comprehension để tạo list sau bài học này.

List comprehension trong Python là gì

List comprehension trong Python hay còn gọi là phương pháp viết nội hàm là một phương pháp đặc biệt chỉ có trong python mà không có trong bất kỳ ngôn ngữ nào khác, giúp bạn có thể tạo list trong python một cách cực kỳ đơn giản.

Khi làm việc với list, sẽ có những lúc bạn cần phải thao tác với những list có cấu trúc phức tạp, mà với phương pháp tạo list thông thường, bạn sẽ cần rất nhiều dòng code để có thể khởi tạo được chúng.

Nhưng những nhà sáng lập ra python với tôn chí python là Đơn giản thì tốt hơn phức tạp, đã tạo ra list comprehension-phương pháp đặc biệt chỉ python mới có, nhằm giúp bạn có thể rút gọn các dòng code cần thiết và tạo ra một list phức tạp chỉ trong nháy mắt.

Ngoài khả năng rút gọn các dòng code cần viết, tốc độ xử lý của phương pháp list comprehension trong Python cũng được cho là nhanh hơn các phương pháp khác.

Sử dụng list comprehension để tạo list trong Python

Cú pháp list comprehension trong python

Như ở phần định nghĩa Kiyoshi đã nói qua, chúng ta sử dụng list comprehension trong python chủ yếu để tạo list trong python.

List comprehension không những giúp chúng ta tạo ra các list đơn giản, mà còn có thể tạo ra các list đa chiều có cấu trúc phức tạp mà với các phương pháp tạo list thông thường, bạn cần rất nhiều xử lý để hoàn thành được nó.

Chúng ta sử dụng list comprehension trong Python để tạo list với cú pháp sau đây:

[expression for variable in iterable]

Trong đó:

  • iterable là một đối tượng chứa nhiều phần tử trong python, ví dụ như một list, tuple, range hay set.
  • variable là một biến để gán giá trị phần tử lấy ra từ iterable.
  • expression là một biểu thức để tính toán với biến variable.

Về quy trình xử lý:

  1. Chúng ta dùng lệnh for để lấy ra lần lượt các phần tử có trong iterable và gán giá trị phần tử đó vào biến variable.
  2. Chúng ta dùng biểu thức expression để tính toán với biến variable và đưa ra một kết quả.
  3. Kết quả trên được dùng để tạo một phần tử trong list mới.

Hãy cùng xem một số ví dụ về cách sử dụng list comprehension để tạo list trong Python sau đây.

Ví dụ cụ thể về sử dụng list comprehension trong python

Tạo một list gồm các số từ 1 đến 5

Cách thông thường:

old_list = list(range(0,6))
comprehension_list = []

for phantu in old_list:
comprehension_list.append(phantu)

Sử dụng list comprehension trong python:

comprehension_list = [number for number in range(0,6)]

Cả hai đều đưa ra cùng kết quả:

print(comprehension_list)

Bạn thấy đó, cùng một kết quả nhưng với việc sử dụng list comprehension đã giúp chúng ta rút gọn code, giảm đi bao nhiêu là công sức rồi đấy.

Tạo một list có phần tử là bình phương các số từ 1 đến 5

Cách thông thường:

old_list = list(range(0,6))
comprehension_list = []

for phantu in old_list:
phantu_moi = phantu**2
comprehension_list.append(phantu_moi)

Sử dụng list comprehension trong python:

comprehension_list = [number**2 for number in range(0,6)]

Cả hai đều cho ra cùng kết quả:

print(comprehension_list)

Cho một list gồm các string khác nhau, tạo ra một list mới với các string ở định dạng LOWER (viết thường)

Để giải quyết bài toán này, chúng ta cần kết hợp phương thức lower() giúp chuyển chữ hoa thành chữ thường trong chuỗi python.

Chúng ta sử dụng list comprehension trong python như sau:

list_thanhpho = ['Long An', 'Ha Noi','Nam Dinh']
list_thanhpho_thuong = [thanhpho.lower() for thanhpho in list_thanhpho]

print(list_thanhpho_thuong)

Bạn có thể thấy với cách viết thông thường, biểu thức càng phức tạp thì số dòng chúng ta cần code sẽ lại càng tăng lên.
Thế nhưng với list comprehension, bạn cũng chỉ cần một dòng code thôi là giải quyết được vấn đề rồi đó.
IT’S SO COOL

Sử dụng hàm tự tạo trong List comprehension python

Ở phần trên chúng ta đã dùng các hàm tích hợp sẵn trong python như lower,upper, cộng trừ nhân chia v.v… trong các biểu thức tính toán.
Ngoài cách dùng hàm tích hợp sẵn, bạn cũng có thể sử dụng hàm tự tạo để chỉ định biểu thức tính toán trong List comprehension python giống như ví dụ sau đây:

Cho một list số nguyên. Hãy tạo một list số mới có phần tử là luỹ thừa của các số trong list cũ

list_số = list(range(11))


def tim_luy_thua(số):
return số ** 2


list_mới = [tim_luy_thua(số) for số in list_số]

print(list_mới)

Cho danh sách tên các con vật, tạo ra một danh sách mới chứa tên các con vật có 4 chân.

list_animal = ['chó', 'mèo', 'rắn', 'voi', 'cá']


def tim_thu_bon_chan (animal):
if animal in ['chó', 'mèo','voi']:
return animal


thu_bon_chan = [animal for animal in list_animal if tim_thu_bon_chan(animal)]

print(thu_bon_chan)

Sử dụng list comprehension trong Python kèm với hàm IF

Chúng ta cũng có thể sử dụng list comprehension trong Python kèm với hàm điều kiện IF.
Lúc này, chỉ khi nào biểu thức điều kiện của hàm if đúng, thì vòng lặp for mới được chạy để tạo phần tử cho list mới.
Cú pháp viết sẽ như sau đây:

[expression for variable in iterable if if_expression]

Trong đó:

  • iterable là một đối tượng chứa nhiều phần tử trong python, ví dụ như một list, tuple, range hay set.
  • variable là một biến để gán giá trị phần tử lấy ra từ iterable.
  • if_expression là biểu thức điều kiện để xét có tiếp tục thực hiện vòng lặp for hay không.
  • expression là một biểu thức để tính toán với biến variable.

Về quy trình xử lý:

  1. Chúng ta dùng lệnh for để lấy ra lần lượt các phần tử có trong iterable và gán giá trị phần tử đó vào biến variable.
  2. Kiểu tra biểu thức điều kiện if_expression, nếu True thì tiến hành tiếp vòng lặp for. Nếu False thì bỏ qua vòng lặp.
  3. Nếu if_expression là true, dùng biểu thức expression để tính toán với biến variable và đưa ra một kết quả.
  4. Kết quả trên được dùng để tạo một phần tử trong list mới.

Hãy cùng xem ví dụ cụ thể sau đây:

Tạo một list mới chứa các số chẵn từ một list số ban đầu

numbers = [0,1,2,3,4,5,6,7,8]
even_numbers = [num for num in numbers if num % 2 ==0]

Bạn có thể kết hợp tạo list bằng hàm range và viết ví dụ trên cực ngắn như sau:

even_numbers = [num for num in list(range(9)) if num % 2 ==0]

Cả hai đều đưa ra cùng một kết quả:

print(even_numbers)

  • Ở đây chúng ta dùng ký hiệu % để lấy số dư trong một phép chia. Hãy tìm hiểu thêm tại Toán tử số học trong python
  • Bạn có thể xem thêm về cách tạo list mới bằng hàm range ở bài Tạo list từ iterable trong python

Tổng kết và thực hành

List comprehension trong Python là một cách viết đặc biệt của python, do đó nếu bạn chưa quen với cách viết này thì có thể cảm thấy khó hiểu đấy. Nhưng một khi đã quen rồi, Kiyoshi đảm bảo bạn sẽ nghiện nó luôn đấy và không còn muốn viết theo cách phổ thông nữa đâu.
Với những lợi thế về khả năng xử lý cũng như khả năng rút gọn code, bạn sẽ có cơ hội gặp cách viết này nhiều trong các dự án viết bằng python. Thế nên trăm hay không bằng tay quen, hãy làm chủ List comprehension trong Python bằng cách thực hành lại các ví dụ ngày hôm nay đi nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về python trong các bài học tiếp theo.

Viết bởi Kiyoshi. Đã đăng ký bản quyền tác giả tại <a title="Bạn được tự do chia sẻ bài viết nhưng phải để lại đường link bài viết từ laptrinhcanban.com. Bạn không được sử dụng tài liệu cho mục đích thương mại. Không được phép chỉnh sửa nội dung được phát hành trên website của chúng tôi" style="color:#fff;background-color:silver" rel="license noopener" target="_blank" href="https://creativecommons.org/licenses/by-nc-nd/4.0/">Creativecommons</a>&nbsp;và <a title="Bạn được tự do chia sẻ bài viết nhưng phải để lại đường link bài viết từ laptrinhcanban.com. Bạn không được sử dụng tài liệu cho mục đích thương mại. Không được phép chỉnh sửa nội dung được phát hành trên website của chúng tôi" style="color:#fff;background-color:silver" target="_blank" rel="noopener" href="https://www.dmca.com/Protection/Status.aspx?ID=1631afcd-7c4a-467d-8016-402c5073e5cd" class="dmca-badge">DMCA</a><script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js">

Bài viết liên quan

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
Hướng dẫn python list comprehension index

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.