Con trăn 3
for f, b in zip(foo, bar):
print(f, b)
zip
dừng lại khi ngắn hơn foo
hoặc bar
dừng lại.
Trong Python 3 , zip
trả về một iterator của các bộ dữ liệu, như itertools.izip
trong Python2. Để có được một danh sách các bộ dữ liệu, sử dụng list(zip(foo, bar))
. Và để nén cho đến khi cả hai trình lặp hết, bạn sẽ sử dụng
itertools.zip_longest .
Con trăn 2
Trong Python 2 , zip
trả về một danh sách các bộ dữ liệu. Điều này là tốt khi foo
và bar
không lớn. Nếu cả hai đều lớn thì hình thành zip(foo,bar)
là một biến tạm thời lớn không cần thiết và nên được thay thế bằng itertools.izip
hoặc
itertools.izip_longest
, trả về một trình vòng lặp thay vì danh sách.
import itertools
for f,b in itertools.izip(foo,bar):
print(f,b)
for f,b in itertools.izip_longest(foo,bar):
print(f,b)
izip
dừng lại khi foo
hoặc bar
là hết
izip_longest
dừng lại khi cả hai foo
và bar
kiệt sức. Khi (các) trình lặp ngắn hơn đã hết, izip_longest
sẽ tạo ra một tuple với None
vị trí tương ứng với trình vòng lặp đó. Bạn cũng có thể thiết lập một sự khác biệt fillvalue
bên cạnh None
nếu bạn muốn. Xem ở đây để biết toàn bộ câu chuyện .
Cũng lưu ý rằng zip
và anh em zip
giống như nó có thể chấp nhận một số lượng lặp tùy ý làm đối số. Ví dụ,
for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'],
['red', 'blue', 'green']):
print('{} {} {}'.format(num, color, cheese))
in
1 red manchego
2 blue stilton
3 green brie
izip
(mặc dùizip
/zip
trông sạch hơn nhiều)?