Thứ tự zip Python

Mã giống như trước với một danh sách dòng bổ sung (zip_object) ở cuối cung cấp cho chúng tôi một danh sách trống vì zip_object với tư cách là trình vòng lặp đã cạn kiệt bên trong vòng lặp for (được in tất cả các phần tử của trình vòng lặp này). Hãy để chúng tôi kiểm tra hành vi với phương thức next()

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
zip_object = zip(n, l)
print(next(zip_object))
print(next(zip_object))
list(zip_object)
# result:
(1, 'a')
(2, 'b')
[(3, 'c'), (4, 'd')]

Chúng ta thấy rằng hai phần tử đầu tiên của zip_object đã được gọi bởi phương thức next() và được in ra, do đó, zip_object cuối cùng được liệt kê có hai phần tử cuối cùng. Hãy để chúng tôi kiểm tra một số lệnh gọi next()

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
zip_object = zip(n, l)
print(next(zip_object))
print(next(zip_object))
print(next(zip_object))
print(next(zip_object))
next(zip_object)
# result:
(1, 'a')
(2, 'b')
(3, 'c')
(4, 'd')
--------------------------------------------------------------------StopIteration Traceback (most recent call last)<ipython-input-2-b10ae380d83b> in <module>()
6 print(next(zip_object))
7 print(next(zip_object))
----> 8 next(zip_object)
StopIteration:

Chúng tôi đã gặp lỗi StopIteration tiêu chuẩn cho các trình vòng lặp, sau quá nhiều lệnh gọi next()

2. trường hợp chiều dài

I nput iterables được chuyển tới zip() có thể có độ dài khác nhau. Trường hợp đặc biệt là.

  • zip() không có đối số, trả về một trình vòng lặp trống
list(zip())# result:
[]
  • Với một đối số có thể lặp lại duy nhất, hàm zip() trả về một trình lặp gồm 1 bộ
list(zip([1, 2, 3, 4))# result:
[(1,), (2,), (3,), (4,)]

Các lần lặp có độ dài khác nhau có thể do thiết kế gây ra và đôi khi do lỗi trong mã chuẩn bị các lần lặp này. Chúng ta có thể giải quyết vấn đề này theo ba cách khác nhau

  • Theo mặc định, zip() dừng khi hết lần lặp đầu vào ngắn nhất. Do đó, chúng tôi mất các mục còn lại trong các lần lặp dài hơn. Kết quả được cắt theo độ dài của lần lặp ngắn nhất
n = [1, 2, 3, 4, 5, 6]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
  • zip() thường được sử dụng trong trường hợp các lần lặp được giả định là có độ dài bằng nhau. Trong những trường hợp như vậy, tôi khuyên bạn nên sử dụng tùy chọnstrict=True của hàm zip() (kể từ Python 3. 10). Không giống như hành vi mặc định, nó kiểm tra xem độ dài của các lần lặp có giống nhau không, tăng ValueError nếu chúng không giống nhau. Nếu không có đối sốstrict=True, bất kỳ lỗi nào dẫn đến các lần lặp có độ dài khác nhau sẽ không được chú ý và sau đó có thể trở thành một lỗi khó tìm trong một phần khác của mã. Hãy để chúng tôi kiểm tra một ví dụ
n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
0
  • Các lần lặp ngắn hơn có thể được đệm bằng một giá trị không đổi để làm cho tất cả các lần lặp có cùng độ dài. Điều này được thực hiện bởi zip_longest() từ thư viện itertools. Tham số đầu vào fillvalue của nó là giá trị mở rộng iterable ngắn hơn. Hãy để chúng tôi có một kiểm tra
n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
1

3. Sắp xếp đối tượng zip

Sắp xếp đối tượng zip theo đầu vào đầu tiên có thể lặp lại. Hãy để chúng tôi xem một ví dụ

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
2

4. thủ thuật giải nén

Hàm zip() kết hợp với toán tử * có thể được sử dụng để giải nén danh sách (hay nói chung là có thể lặp lại). Hãy để chúng tôi xem một ví dụ

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
3

5. Thưởng. thủ thuật chunking

Thứ tự đánh giá từ trái sang phải của các lần lặp đầu vào được đảm bảo trong hàm zip(). Điều này tạo khả năng phân cụm chuỗi dữ liệu thành các nhóm có độ dài bằng nhau. Hãy để chúng tôi bắt đầu với một danh sách

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
4

Đầu tiên, [n]*2 tạo một danh sách có hai danh sách (danh sách n lặp lại). Điều này tương đương với [n, n]. Tiếp theo, toán tử * giải nén hai danh sách đó (cùng một danh sách) n và đặt chúng làm đối số cho hàm zip(). Do đó, kết quả giống như đối với list(zip(n,n))

Bây giờ điều khó khăn. Thay vì danh sách n, chúng ta đặt một iterator iter(n). Điều này lặp lại cùng một trình vòng lặp n lần để mỗi bộ dữ liệu đầu ra có kết quả của n lệnh gọi đến trình vòng lặp. Nhưng với mỗi cuộc gọi của iterator như vậy, chúng ta liên tiếp mất phần tử ban đầu của nó và cuối cùng nhận được

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
5

Sức mạnh của phương pháp này là khi danh sách ban đầu của chúng tôi rất dài và chúng tôi muốn chia nhỏ dữ liệu của mình với bất kỳ kích thước khối nào. Chúng ta hãy xem một ví dụ dưới đây

n = [1, 2, 3, 4]
l = ['a', 'b', 'c', 'd']
list(zip(n, l))
# result:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
6

T tất cả đều nằm trong câu chuyện ngắn của tôi về hàm zip(). Tôi hy vọng rằng bạn sẽ áp dụng một số thủ thuật được trình bày trong mã hóa của mình. Hãy thử chơi với hàm zip() với số lần lặp khác nhau và các loại khác nhau của chúng.

Nếu bạn quan tâm đến các chủ đề Khoa học dữ liệu và bạn cho rằng bài viết của tôi có giá trị, bạn có thể theo dõi tôi trên LinkedIn hoặc Medium. Tôi rất vui được thảo luận về bất kỳ chủ đề Khoa học dữ liệu, Số liệu thống kê, Toán học hoặc ML nào với bạn. Bạn cũng có thể trở thành thành viên Phương tiện, có quyền truy cập không giới hạn vào tất cả nội dung và hỗ trợ tất cả các nhà văn bằng liên kết giới thiệu của tôi. Cảm ơn, Greg

Bạn có thể sắp xếp một đối tượng zip trong Python không?

Bạn không thể sử dụng sắp xếp trên đối tượng zip , đối tượng zip không có thuộc tính đó. Tuy nhiên, bạn có thể chuyển đổi đối tượng zip thành danh sách có list(zipped_object) rồi áp dụng sắp xếp trên đó để thực hiện sắp xếp tại chỗ.

Bạn có thể nén 4 danh sách Python không?

Hàm zip() của Python cũng giúp dễ dàng nén nhiều hơn hai danh sách . Điều này hoạt động chính xác như bạn mong đợi, nghĩa là bạn chỉ cần chuyển các danh sách dưới dạng các đối số khác nhau. Cái này là cái gì? .

Bạn có thể nén chuỗi Python không?

Python có mô-đun tệp zip cho phép bạn đọc/ghi tệp lưu trữ zip . tệp nén. Lớp ZipFile có phương thức writetr() có thể tạo một "tệp" trong kho lưu trữ trực tiếp từ một chuỗi. Vì vậy, không, bạn không cần phải ghi chuỗi của mình vào một tệp trước khi lưu trữ nó.

Zip có trả lại một tuple không?

Hàm zip() trả về một bộ lặp gồm các bộ dựa trên các đối tượng có thể lặp . Nếu một lần lặp duy nhất được thông qua, zip() trả về một bộ lặp gồm các bộ với mỗi bộ chỉ có một phần tử. Nếu nhiều lần lặp được thông qua, zip() trả về một bộ lặp gồm các bộ với mỗi bộ có các phần tử từ tất cả các lần lặp.