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.

Hãy thử Giải pháp này trong Trình chỉnh sửa

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)
Đầu ra thiết bị đầu cuối
--- 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à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.