Nó không phải quá khó để chỉ viết Python rõ ràng để làm các hoạt động mong muốn:
def izip_short(a, b):
ia = iter(a)
ib = iter(b)
for x in ia:
try:
y = next(ib)
yield (x, y)
except StopIteration:
yield (x,)
break
for x in ia:
yield (x,)
for y in ib:
yield (None, y)
a = [1, 2, 3]
b = [9, 10]
list(izip_short(a, b))
list(izip_short(b, a))
Tôi đã không chắc chắn làm thế nào bạn sẽ muốn để xử lý trình tự b
dài hơn trình tự a
, vì vậy, tôi chỉ cần nhập số None
cho giá trị đầu tiên trong bộ tuple trong trường hợp đó.
Nhận trình lặp lặp lại rõ ràng cho mỗi chuỗi. Chạy trình chuyển đổi a
dưới dạng vòng lặp for
, trong khi sử dụng thủ công next(ib)
để nhận giá trị tiếp theo từ trình tự b
. Nếu chúng tôi nhận được một StopIteration
trên trình tự b
, chúng tôi sẽ ngắt vòng lặp và sau đó for x in ia:
sẽ nhận được phần còn lại của chuỗi a
; sau đó for y in ib:
sẽ không làm gì vì trình lặp đó đã hết. Ngoài ra, nếu vòng lặp for x in ia:
đầu tiên loại bỏ thiết bị lặp a
, thì for x in ia:
thứ hai không làm gì ngoài các giá trị còn lại trong trình tự b
và vòng lặp for y in ib:
thu thập chúng.
Sử dụng 'itertools.zip_longest' cho Python 3.5+. –