Hàm Python zip() chấp nhận các mục có thể lặp (iterable) và gộp chúng thành một tuple đơn. Giá trị kết quả là đối tượng zip lưu trữ các cặp iterable. Bạn có thể truyền danh sách, tuple, set, hoặc từ điển qua hàm zip().
Python có nhiều hàm tích hợp cho phép coder lặp qua dữ liệu. Một trong những hàm này là Python zip. Hàm zip() tạo iterator gộp phần tử từ hai hoặc nhiều nguồn dữ liệu thành một.
Trong hướng dẫn này, chúng ta phân tích cơ bản Python zip(). Chúng ta cũng thảo luận cách lặp qua zip và cách unzip (giải nén) đối tượng đã zip.
Tóm tắt về Iteration (Lặp) trong Python
Trong Python, chúng ta dùng thuật ngữ iterate mô tả khi chương trình chạy qua danh sách. Ví dụ, bạn có vòng lặp for in tên mọi chi nhánh công ty hoạt động. Chúng ta nói chương trình đang iterating qua danh sách tên.
Một iterable, mặt khác, là đối tượng có thể trả về các mục thành viên riêng lẻ. Mảng là iterable vì bạn có thể in từng mục riêng lẻ bằng vòng lặp for.
Hàm Python zip
Hàm zip() kết hợp nội dung hai hoặc nhiều iterable. zip() trả về đối tượng zip. Đây là iterator của tuple nơi tất cả giá trị bạn truyền làm đối số được lưu như cặp.
Hàm zip() Python nhận iterable — như danh sách, tuple, set, hoặc từ điển — làm đối số. Hàm tạo danh sách tuple chứa phần tử từ mỗi iterable bạn truyền vào.
Cú pháp hàm zip() như sau:
zip(iterable1, iterable2, ...)
Bạn có thể bao gồm bao nhiêu iterable tùy ý. Bạn phải chỉ định iterable muốn gộp làm đối số cho zip().
Phương thức zip() tiếp tục thực thi cho đến khi đối tượng iterable được zip hoàn toàn. Điều này xảy ra khi iterable cạn kiệt. Nói cách khác, zip() dừng khi tất cả cặp có thể tạo đã được tạo.
Ví dụ Python zip
Giả sử bạn có hai danh sách Python. Một chứa tên nhân viên, kia chứa số nhân viên. Bạn muốn gộp cả hai thành mảng tuple. Điều này cho phép lưu tên và số nhân viên cạnh nhau.
Chúng ta dùng zip() gộp hai danh sách. Chương trình ví dụ gộp dữ liệu:
employee_numbers = [2, 9, 18, 28] employee_names = ["Candice", "Ava", "Andrew", "Lucas"] zipped_values = zip(employee_names, employee_numbers) zipped_list = list(zipped_values) print(zipped_list)
Hàm zip trả về:
[('Candice', 2), ('Ava', 9), ('Andrew', 18), ('Lucas', 28)]
Chương trình tạo mảng các mục tuple. Mỗi tuple chứa tên nhân viên và số nhân viên tương ứng.
Trên hai dòng đầu, khai báo biến lưu số và tên nhân viên.
Tiếp theo, thực hiện hàm zip(). Hàm gộp hai danh sách và tạo mảng tuple mới.
Chúng ta chuyển mục zip thành danh sách. Điều này vì zip() trả về đối tượng zip. Chúng ta có thể lặp qua đối tượng zip. Tuy nhiên, không thể in zip ra console thấy nội dung dạng đọc được. Phải chuyển đối tượng zip thành danh sách để xem nội dung từ console.
Chúng ta biết zipped_values là mục zip() bằng thêm mã:
print(type(zipped_values))
Mã trả về lớp zip:
Trong ví dụ, zip hai mục. Tuy nhiên, nếu có nhiều hơn muốn zip, cũng làm được. Thay đổi duy nhất là truyền danh sách khác vào zip().
Lặp qua Iterables dùng zip trong Python
Hàm zip() trả về iterator. Nghĩa là chúng ta xem nội dung mỗi mục zip riêng lẻ.
Làm việc với nhiều iterable là trường hợp phổ biến nhất cho zip() trong Python. Ví dụ, nếu muốn đi qua nhiều danh sách, có thể dùng zip().
Dùng zip() lặp qua cả employee_numbers và employee_names:
employee_numbers = [2, 9, 18, 28]
employee_names = ["Candice", "Ava", "Andrew", "Lucas"]
for name, number in zip(employee_names, employee_numbers):
print(name, number)
Mã trả về:
Candice 2 Ava 9 Andrew 18 Lucas 28
Chương trình lặp qua danh sách tuple zip() trả về, chia thành hai giá trị: name và number.
Điều này dễ dàng lặp qua nhiều đối tượng iterable cùng lúc. Chúng ta xem tên nhân viên cạnh số nhân viên. Nếu muốn, có thể lặp qua ba hoặc nhiều iterable hơn.
Giải nén giá trị (Unzip Values) trong Python
Trong mã, chúng ta zip các loại dữ liệu. Nhưng làm sao khôi phục dữ liệu dạng trước? Nếu có danh sách tuple — hoặc giá trị zip — muốn chia, dùng toán tử giải nén (unpacking operator) của zip(). Đây là dấu hoa thị * dùng cùng zip().
Ví dụ toán tử giải nén zip():
employees_zipped = [('Candice', 2), ('Ava', 9), ('Andrew', 18), ('Lucas', 28)]
employee_names, employee_numbers = zip(*employees_zipped)
print(employee_names)
print(employee_numbers)
Mã trả về:
('Candice', 'Ava', 'Andrew', 'Lucas')
(2, 9, 18, 28)
Dòng đầu, định nghĩa biến bao gồm danh sách tuple. Dòng sau, định nghĩa hai biến: employee_names và employee_numbers. Gán giá trị từ hàm unzip.
Hàm unzip là hàm zip lấy biến employees_zipped giải nén zip dùng toán tử giải nén *. Trong ví dụ, in hai biến mới chứa tên và số nhân viên.
Kết luận
Hàm zip() nhận đối tượng iterable làm đầu vào và gộp thành đối tượng zip(). Đối tượng này hiển thị giá trị từ mỗi đầu vào iterable cạnh nhau. Hữu ích nếu có hai hoặc nhiều mảng/tuple muốn gộp thành một.
Chúng ta thảo luận dùng zip() với không hoặc một đầu vào. Bạn có thể dùng zip() lặp qua iterables và unzip dữ liệu đã zip. Bạn đang trên đường thành thạo hàm Python zip().
Đọc hướng dẫn How to Code in Python thêm mẹo và lời khuyên học ngôn ngữ phát triển phần mềm Python.