Cách sử dụng hàm zip() trong Python (Kết hợp các vòng lặp)
Tìm hiểu cách sử dụng hàm zip() của Python để kết hợp nhiều lần lặp song song. Nắm vững các sáng tạo từ điển, logic giải nén và xử lý các trường hợp độ dài không khớp.
Tổng quan
Khi lặp lại các tập dữ liệu, bạn thường sẽ cần xử lý song song nhiều danh sách liên quan. Ví dụ: ghép nối danh sách tên người dùng với danh sách ID người dùng hoặc khớp tọa độ của giá trị X và Y. Thay vì các vòng lặp lồng nhau hoặc truy cập các mục bằng cách sử dụng bộ đếm chỉ mục danh sách, Python cung cấp hàm `zip()` tinh tế.
Hàm `zip(*iterables)` lấy nhiều lần lặp làm đối số và tổng hợp chúng, trả về một trình lặp gồm các bộ dữ liệu trong đó bộ dữ liệu thứ i chứa phần tử thứ i từ mỗi lần lặp đầu vào. Điều này cho phép bạn dễ dàng lặp qua hai hoặc nhiều bộ sưu tập cùng lúc bằng một vòng lặp `for`.
Theo mặc định, `zip()` dừng kết hợp khi hết vòng lặp đầu vào ngắn nhất. Mọi phần tử còn lại trong vòng lặp dài hơn sẽ bị loại bỏ. Nếu bạn muốn ghép nối các phần tử cho đến khi hết vòng lặp dài nhất, điền các giá trị còn thiếu bằng trình giữ chỗ, Python sẽ cung cấp `zip_longest()` trong mô-đun `itertools` của thư viện chuẩn.
Đầu ra mã & thực thi
Tập lệnh này minh họa việc lặp lại danh sách song song, tạo từ điển bằng zip và xử lý các trường hợp không khớp bằng zip_longest.
from itertools import zip_longest
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]
# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
print(f"{name} scored {score}")
# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)
# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]
# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))
# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95
Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}
Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]Triển khai từng bước
- Chuyển nhiều danh sách hoặc các lần lặp mà bạn muốn kết hợp vào hàm zip().
- Giải nén các bộ dữ liệu đã tạo trong câu lệnh vòng lặp for để có các bước lặp song song rõ ràng.
- Chuyển đổi đối tượng zip thành từ điển bằng cách sử dụng dict(zip(keys_list, value_list)) để ánh xạ.
- Nhập itertools.zip_longest để kết hợp các danh sách có độ dài không bằng nhau mà không làm mất giá trị đuôi.
Câu hỏi thường gặp
Làm cách nào để "giải nén" một chuỗi các bộ dữ liệu được nén?
Bạn có thể giải nén một chuỗi trở lại thành các danh sách riêng biệt bằng cách sử dụng toán tử giải nén *: list(zip(*zipped_tuples)).
Zip() có trùng lặp các phần tử trong bộ nhớ không?
Không, zip() trả về một trình vòng lặp tạo ra các phần tử theo yêu cầu, giúp nó cực kỳ tiết kiệm bộ nhớ.
Chủ đề liên quan
Tìm hiểu cách lặp hoặc lặp qua từ điển Python. Khám phá các phương pháp lặp qua các khóa, giá trị và cặp khóa-giá trị bằng các ví dụ rõ ràng, có thể chạy được.
Cách hợp nhất hai danh sách trong PythonTìm hiểu những cách tốt nhất để hợp nhất và kết hợp hai danh sách trong Python. So sánh toán tử cộng, phương thức mở rộng, giải nén danh sách và các tùy chọn chuỗi.
Tài nguyên Python được đề xuất
Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.
Hàm Python
Làm chủ các hàm Python. Tìm hiểu cách viết mã có thể sử dụng lại bằng cách sử dụng def, xác định đối số, trả về giá trị và hiểu phạm vi cục bộ và toàn cầu.
Bảng tóm tắt các chức năng của mô-đun toán học Python
Hướng dẫn tham khảo nhanh thư viện chuẩn toán Python. Tìm hiểu cách sử dụng các hàm lượng giác, logarit, làm tròn và số học.
Python vs JavaScript: Ngôn ngữ lập trình nào tốt nhất?
So sánh toàn diện giữa Python và JavaScript. Khám phá sự khác biệt về cú pháp, hiệu suất, trường hợp sử dụng (phụ trợ so với giao diện người dùng) và các ví dụ về mã hóa.