HomeLập trìnhPythonHàm zip() trong...

Hàm zip() trong Python – Được giải thích bằng các ví dụ về mã


Bạn đã bao giờ cần lặp qua nhiều lần lặp song song khi mã hóa bằng Python chưa?

Trong hướng dẫn này, chúng ta sẽ sử dụng Python zip() để thực hiện hiệu quả phép lặp song song qua nhiều lần lặp.

Đây là những gì chúng tôi sẽ đề cập trong bài viết này:


Cách sử dụng Toán tử ‘in’ trong Python để Traverse Iterables

Trước khi chúng ta tiếp tục và tìm hiểu về zip() chức năng, hãy nhanh chóng xem lại cách chúng tôi sử dụng in nhà điều hành với một for vòng lặp để truy cập các mục trong một lần lặp (danh sách, bộ dữ liệu, từ điển, chuỗi, v.v.). Đoạn mã dưới đây cho thấy cú pháp chung:

for item in list_1:
	# do something on item

Nói một cách đơn giản, chúng tôi nói với trình thông dịch Python: “Này đó! Vui lòng lặp lại list_1 để truy cập từng item và thực hiện một số thao tác trên mỗi item.

Điều gì sẽ xảy ra nếu chúng ta có nhiều hơn một danh sách (hoặc bất kỳ danh sách nào có thể lặp lại)? Nói, N danh sách – bạn có thể chèn số yêu thích của mình thay cho N. Bây giờ mọi thứ có vẻ hơi khó khăn và cách tiếp cận sau sẽ không hiệu quả:

# Example - 2 lists, list_1 and list_2

for i1 in list_1:
	for i2 in list_2:
    	 # do something on i1 and i2

Xin lưu ý rằng đoạn mã trên:

  • chạm đầu tiên vào mục đầu tiên trong list_1,
  • sau đó lặp qua list_2 truy cập từng mục trong list_2,
  • sau đó truy cập mục thứ hai trong list_1,
  • và lặp qua toàn bộ list_2 một lần nữa, và
  • làm điều này cho đến khi nó đi qua toàn bộ list_1

Rõ ràng, đây không phải là những gì chúng tôi muốn. Chúng tôi cần có thể truy cập các mục tại một chỉ mục cụ thể từ cả hai danh sách. Đây chính xác là những gì được gọi là lặp song song.

Tại sao sử dụng đối tượng phạm vi () của Python luôn không phải là lựa chọn tối ưu

Bạn có thể nghĩ đến việc sử dụng range() đối tượng với for vòng. “Nếu tôi biết rằng tất cả các danh sách đều có cùng số mục, tôi có thể không chỉ sử dụng index để nhấn vào từng danh sách đó và lấy mục ra ở vị trí đã chỉ định index?”

Vâng, chúng ta hãy cho nó một thử. Mã nằm trong đoạn trích bên dưới. Bạn biết rằng tất cả các danh sách – list_1, list_2,…, list_N – chứa cùng một số mục. Và bạn tạo một range() đối tượng như hình bên dưới và sử dụng chỉ mục i để truy cập mục tại vị trí i trong mỗi iterables.

for i in range(len(list_1)):
	# do something on list_1[i],list_2[i],list_3[i],...,list_N[i]

Như bạn có thể đoán bây giờ, điều này hoạt động như mong đợi chỉ khi tất cả các lần lặp chứa cùng số mục.

Hãy xem xét trường hợp một hoặc nhiều danh sách được cập nhật – giả sử, một danh sách có thể có một mục bị xóa khỏi danh sách đó và một danh sách khác có thể có một mục được thêm vào. Điều này sẽ gây nhầm lẫn:

  • bạn có thể chạy vào IndexErrors khi bạn đang truy cập các mục tại chỉ số không còn giá trị vì mục tại chỉ mục đã bị xóa hoặc
  • Bạn có thể không phải thì là ở truy cập tất cả các mục mới được thêm vào vì chúng đang ở các chỉ số hiện không nằm trong phạm vi của các chỉ số được truy cập.
Đọc thêm  Python Sleep – time.sleep() trong Python

Bây giờ chúng ta hãy xem cách Python zip() chức năng có thể giúp chúng tôi lặp qua nhiều danh sách song song. Đọc trước để tìm hiểu.

Cách chức năng zip() của Python hoạt động

Hãy bắt đầu bằng cách tra cứu tài liệu về zip() và phân tích nó trong các phần tiếp theo.

cú pháp: zip(*iterables) – các zip() hàm nhận một hoặc nhiều lần lặp làm đối số.

Tạo một trình lặp tổng hợp các phần tử từ mỗi lần lặp.
1. Trả về một trình vòng lặp của các bộ, trong đó tôi-bộ thứ chứa tôi-th phần tử từ mỗi chuỗi đối số hoặc lần lặp.
2. Trình vòng lặp dừng khi hết vòng lặp đầu vào ngắn nhất.
3. Với một đối số có thể lặp lại duy nhất, nó trả về một trình lặp gồm 1 bộ.
4. Không có đối số, nó trả về một trình vòng lặp trống. – Tài liệu Python

Cách hàm zip() tạo một Iterator của Tuples

Hình minh họa sau đây giúp chúng ta hiểu cách zip() chức năng hoạt động bằng cách tạo ra một bộ lặp của bộ dữ liệu từ hai danh sách đầu vào, L1L2. Kết quả của cuộc gọi zip() trên iterables được hiển thị bên phải.

zipf
  • Lưu ý cách bộ dữ liệu đầu tiên (tại chỉ mục ) bên phải chứa 2 mục, tại mục lục Trong L1L2tương ứng.
  • Bộ dữ liệu thứ hai (tại chỉ mục 1) chứa các mục tại chỉ mục 1 Trong L1L2.
  • Nói chung, bộ dữ liệu tại chỉ mục i chứa các mục tại chỉ mục i Trong L1L2.

Hãy thử một vài ví dụ trong phần tiếp theo.

Đọc thêm  Cách tốt nhất để học Python – Hướng dẫn lập trình Python cho người mới bắt đầu

Cách sử dụng Hàm zip() của Python – Hãy tự mình thử!

Hãy thử chạy các ví dụ sau trong IDE yêu thích của bạn.

Ví dụ đầu tiên, hãy chọn hai danh sách L1L2 chứa 5 mục mỗi. Hãy gọi zip() chức năng và chuyển vào L1L2 như những lập luận.

L1 = [1,2,3,4,5]
L2 = ['a','b','c','d','e']

zip_L1L2 = zip(L1,L2)

print(zip_L1L2)
# Sample Output
<zip object at 0x7f92f44d5550>

Hãy truyền đối tượng zip vào một danh sách và in nó ra, như hình bên dưới.

print(list(zip_L1L2))

# Output
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]

Điều gì xảy ra khi các Iterable có độ dài khác nhau?

Nếu bạn quay lại tài liệu, mục thứ hai trong danh sách được đánh số sẽ đọc: “Trình lặp dừng khi hết lần lặp đầu vào ngắn nhất.”

Không giống như làm việc với range() đối tượng, sử dụng zip() không đưa ra lỗi khi tất cả các lần lặp có độ dài tiềm ẩn khác nhau. Hãy xác minh điều này như hình dưới đây.

Hãy loại bỏ 'e' từ L2và lặp lại các bước ở trên.

L1 = [1,2,3,4,5]
L2 = ['a','b','c','d']

zip_L1L2 = zip(L1,L2)

print(list(zip_L1L2))

# Output
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

Bây giờ chúng ta thấy rằng danh sách đầu ra chỉ chứa 4 bộ và mục 5 từ L1 chưa được sử dụng. Càng xa càng tốt!

Điều gì xảy ra khi bạn chuyển một hoặc không thể lặp lại cho hàm zip()?

Hãy xem lại mục 3 và 4 của tài liệu một lần nữa.

“Với một đối số có thể lặp lại duy nhất, nó trả về một trình lặp gồm 1 bộ.
Không có đối số, nó trả về một trình vòng lặp trống.”

Hãy tiếp tục và xác minh điều này. Quan sát cách chúng tôi nhận được 1-tuple khi chúng tôi chỉ chuyển vào L1 trong đoạn mã dưới đây:

L1 = [1,2,3,4,5]
zip_L1 = zip(L1)
print(list(zip_L1))

# Output
[(1,), (2,), (3,), (4,), (5,)]

Khi chúng tôi gọi zip() không có đối số, chúng ta sẽ nhận được một danh sách trống, như hình bên dưới:

zip_None = zip()
print(list(zip_None))

# Output
[]

Bây giờ hãy tạo một ví dụ trực quan hơn. Đoạn mã dưới đây cho thấy cách chúng ta có thể sử dụng zip() để nén 3 danh sách lại với nhau và thực hiện các thao tác có ý nghĩa.

Đọc thêm  Cách nhúng trực quan hóa Python tương tác trên trang web của bạn bằng Python và Matplotlib

Đưa ra một danh sách các loại trái cây, giá của chúng và số lượng bạn đã mua, tổng số tiền chi cho mỗi mặt hàng sẽ được in ra.

fruits = ["apples","oranges","bananas","melons"]
prices = [20,10,5,15]
quantities = [5,7,3,4]

for fruit, price, quantity in zip(fruits,prices,quantities):
  print(f"You bought {quantity} {fruit} for ${price*quantity}")
  
# Output
You bought 5 apples for $100
You bought 7 oranges for $70
You bought 3 bananas for $15
You bought 4 melons for $60
  

Bây giờ chúng tôi hiểu làm thế nào các zip() chức năng hoạt động và chúng tôi biết giới hạn của nó là trình vòng lặp dừng khi hết vòng lặp ngắn nhất. Vì vậy, hãy xem làm thế nào chúng ta có thể khắc phục hạn chế này bằng cách sử dụng zip_longest() chức năng trong Python.

Cách sử dụng hàm zip_longest() trong Python

Hãy nhập khẩu zip_longest() chức năng từ itertools mô-đun:

from itertools import zip_longest

Bây giờ chúng ta hãy thử một ví dụ trước đó về L2 chứa một mặt hàng ít hơn L1.

L1 = [1,2,3,4,5]
L2 = ['a','b','c','d']

zipL_L1L2 = zip_longest(L1,L2)

print(list(zipL_L1L2))

# Output
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, None)]

Lưu ý cách mục 5 từ L1 vẫn được bao gồm. Nhưng vì không có mục phù hợp trong L2phần tử thứ hai trong bộ dữ liệu cuối cùng là None.

Bạn có thể tùy chỉnh thêm nếu muốn. Ví dụ, bạn có thể thay thế None với một thuật ngữ chỉ định hơn như Empty, Item Not Found, và như thế. Tất cả những gì bạn phải làm là đặt tùy chọn fillvalue đối số với thuật ngữ mà bạn muốn hiển thị khi không có mục phù hợp trong một lần lặp khi bạn gọi zip_longest().

Tôi hy vọng bây giờ bạn đã hiểu Python zip()zip_longest() chức năng.

Cảm ơn bạn đã đọc! Hẹn gặp lại tất cả các bạn sớm trong một bài viết khác.



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status