Show
Bạn đã bao giờ cần lặp qua nhiều đoạn lặp song song khi viết mã bằng Python chưa? Trong hướng dẫn này, chúng tôi sẽ sử dụng hàm zip () của Python để thực hiện hiệu quả việc lặp song song trên nhiều lần lặp. Đây là những gì chúng ta sẽ đề cập trong bài đăng này: * Cách sử dụng Toán tử ‘in’ trong Python để Traverse Bạn đang xem: zip trong python là gì
Bạn đã bao giờ cần lặp qua nhiều vòng lặp song song khi viết mã bằng Python chưa? Trong hướng dẫn này, chúng tôi sẽ sử dụng hàm zip () của Python để thực hiện hiệu quả việc lặp song song trên nhiều iterables. Đây là những gì chúng tôi sẽ đề cập trong bài đăng này: Cách Sử dụng Toán tử ‘in’ trong Python để Traverse Lặp lạiTrước khi chúng ta hãy tiếp tục và tìm hiểu về hàm zip () , hãy nhanh chóng xem lại cách chúng tôi sử dụng toán tử in với vòng lặp for để truy cập các mục trong một có thể lặp lại (danh sách, bộ giá trị, từ điển, chuỗi, v.v.). Đoạn mã bên dưới hiển thị cú pháp chung: cho mục trong danh sách_1: # làm gì đó trên mụcNói một cách đơn giản, chúng tôi nói với trình thông dịch Python: “Xin chào! Vui lòng lặp qua list_1 để truy cập từng mục và thực hiện một số thao tác trên mỗi mục . " Đ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)? Giả sử, danh sách N - bạn có thể chèn số yêu thích của mình vào vị trí của N . Mọi thứ hiện có vẻ hơi khó khăn và cách tiếp cận sau sẽ không hoạt động: # Ví dụ - 2 danh sách, danh sách_1 và danh sách_2 cho i1 trong danh sách_1: cho i2 trong danh sách_2: # làm gì đó trên i1 và i2Xin lưu ý rằng đoạn mã trên:
Rõ ràng, đây không phải là điều 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 lại song song. Tại sao lại sử dụng đối tượng range () của Python Luôn luôn không phải là Lựa chọn Tối ưuBạn có thể nghĩ đến việc sử dụng đối tượng range () với vòng lặp for . "Nếu tôi biết rằng tất cả các danh sách đều có cùng số lượng mục, tôi có thể không chỉ sử dụng index để khai thác vào từng danh sách đó và kéo ra mục tại index ? " Chà, hãy thử xem. Đoạn mã nằm trong đoạn mã dưới đây. 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 đối tượng range () như hình bên dưới và sử dụng chỉ mục i để truy cập mục ở vị trí i trong mỗi mục trong số các mục. cho tôi trong phạm vi (len (list_1)): # làm điều gì đó trên 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 vòng lặp chứa cùng một số lượng 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ây giờ, hãy xem cách Python sử dụng zip () có thể giúp chúng ta lặp qua nhiều danh sách song song. Đọc trước để tìm hiểu. Hàm zip () của Python hoạt động như thế nàoHãy bắt đầu bằng cách tìm kiếm tài liệu cho zip () và phân tích cú pháp nó trong các phần tiếp theo. Cú pháp : zip (* iterables) - zip () nhận một hoặc nhiều đoạn lặp làm đối số.
Cách hàm zip () tạo một Iterator of Tuplesminh họa sau đây giúp chúng tôi hiểu cách hoạt động của hàm zip () bằng cách tạo một trình lặp các bộ giá trị từ hai danh sách đầu vào, L1 và L2 . Kết quả của việc gọi zip () trên các tệp lặp được hiển thị ở bên phải.
< li> Nói chung, bộ tại chỉ mục i chứa các mục tại chỉ mục i trong L1 và L2 . Hãy thử một vài ví dụ trong phần tiếp theo. 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, chúng ta hãy chọn hai danh sách L1 và L2 chứa 5 nó mỗi ems. Hãy gọi hàm zip () và chuyển vào ngôn ngữ L1 và L2 . L1 = [1,2,3,4,5] L2 = ['a', 'b', 'c', 'd', 'e'] zip_L1L2 = zip (L1, L2) in (zip_L1L2) # Đầu ra Mẫu & lt; zip đối tượng tại 0x7f92f44d5550 & gt;Hãy truyền đối tượng zip vào danh sách và in nó ra, như được hiển thị bên dưới. print (list (zip_L1L2 )) # Đầu ra [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]< h3 id = "what-going-when-the-iterables-are-of-other-lengths"> Điều gì sẽ xảy ra khi các Đoạn lặp có độ dài Khác nhau? Nếu bạn quay lại tài liệu, điều thứ hai mục trong danh sách được đánh số có nội dung: "Trình vòng lặp dừng khi đầu vào ngắn nhất có thể lặp lại hết." Không giống như làm việc với đối tượng range () , việc sử dụng zip () không gây ra lỗi khi tất cả các mục có thể có độ dài khác nhau. Hãy xác minh điều này như được hiển thị bên dưới. Hãy xóa 'e' khỏi L2 và lặp lại các bước ở trên. < code class = "language-Python"> L1 = [1,2,3,4,5] L2 = ['a', 'b', 'c', 'd'] zip_L1L2 = zip (L1, L2) in (danh sách (zip_L1L2)) # Đầu ra [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]Bây giờ chúng ta thấy rằng đầu ra danh sách chỉ chứa 4 bộ giá trị và mục 5 từ L1 chưa được sử dụng. Càng xa càng tốt! Điều gì sẽ xảy ra khi bạn chuyển một lần hoặc không lặp lại Hàm zip ()?Hãy truy cập lại mục 3 và 4 của tài liệu.
Hãy tiếp tục và xác minh điều này. Hãy quan sát cách chúng tôi nhận được 1 bộ giá trị khi chỉ nhập L1 trong đoạn mã bên dưới: L1 = [1,2, 3,4,5] zip_L1 = zip (L1) in (danh sách (zip_L1)) # Đầu ra [(1,), (2,), (3,), (4,), (5,)]Khi chúng tôi gọi hàm zip () mà không có đối số, chúng tôi nhận được một danh sách trống, như được hiển thị bên dưới: zip_None = zip () print (list (zip_None)) # Đầu ra []Bây giờ hãy tạo một ví dụ trực quan hơn. Đoạn mã bên dưới cho thấy cách chúng tôi 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. Với danh sách các loại trái cây, giá cả và số lượng bạn đã mua, tổng số tiền chi tiêu cho mỗi mặt hàng sẽ được in ra. trái cây = ["táo", "cam", "chuối", "dưa"] giá = [20,10,5,15] số lượng = [5,7,3,4] cho trái cây, giá cả, số lượng trong zip (trái cây, giá cả, số lượng): print (f "Bạn đã mua {số lượng} {trái cây} với giá $ {price * số lượng}") # Đầu ra Bạn đã mua 5 quả táo với giá 100 đô la Bạn đã mua 7 quả cam với giá 70 đô la Bạn đã mua 3 quả chuối với giá 15 đô la Bạn đã mua 4 quả dưa với giá 60 đô laBây giờ chúng ta đã hiểu cách hoạt động của hàm zip () và chúng ta biết hạn chế của nó là trình lặp sẽ dừng khi hết vòng lặp ngắn nhất. Vì vậy, hãy xem cách chúng ta có thể khắc phục hạn chế này bằng cách sử dụng hàm zip_longest () trong Python. Cách sử dụng hàm zip_longest () trong PythonHãy nhập hàm zip_longest () từ mô-đun itertools : từ itertools nhập zip_longestBây giờ, hãy thử một ví dụ trước đó về L2 chứa một mục nhỏ hơn L1 . < / p> L1 = [1,2,3,4,5] L2 = ['a', 'b', 'c', 'd'] zipL_L1L2 = zip_longest (L1, L2) in (danh sách (zipL_L1L2)) # Đầu ra [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, None)]Lưu ý rằng mục 5 từ L1 vẫn được bao gồm. Nhưng vì không có mục nào phù hợp trong L2 , nên phần tử thứ hai trong bộ cuối cùng là None . Bạn có thể tùy chỉnh nó nhiều hơn nếu bạn muốn. Ví dụ: bạn có thể thay thế Không có bằng một thuật ngữ chỉ rõ hơn như Empty , Item Not Found , v.v. Tất cả những gì bạn phải làm là đặt đối số fillvalue tùy chọn thành thuật ngữ mà bạn muốn hiển thị khi không có mục phù hợp nào trong một tệp có thể lặp lại khi bạn gọi zip_longest () . Tôi hy vọng bây giờ bạn đã hiểu các hàm zip () và zip_longest () của Python. Cảm ơn bạn đã đọc! Hẹn gặp lại tất cả các bạn trong một bài viết khác. Xem thêm những thông tin liên quan đến chủ đề zip trong python là gì
Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình |