Tôi muốn phân tích 2 trình tạo có độ dài khác nhau (có khả năng) bằng zip:
for el1, el2 in zip(gen1, gen2):
print(el1, el2)
Tuy nhiên, nếu gen2có ít yếu tố hơn, một yếu tố phụ gen1là "tiêu thụ".
Ví dụ,
def my_gen(n:int):
for i in range(n):
yield i
gen1 = my_gen(10)
gen2 = my_gen(8)
list(zip(gen1, gen2)) # Last tuple is (7, 7)
print(next(gen1)) # printed value is "9" => 8 is missing
gen1 = my_gen(8)
gen2 = my_gen(10)
list(zip(gen1, gen2)) # Last tuple is (7, 7)
print(next(gen2)) # printed value is "8" => OK
Rõ ràng, một giá trị bị thiếu ( 8trong ví dụ trước của tôi) vì gen1được đọc (do đó tạo ra giá trị 8) trước khi nó nhận ra gen2không có nhiều phần tử. Nhưng giá trị này biến mất trong vũ trụ. Khi gen2"dài hơn", không có "vấn đề" như vậy.
HỎI : Có cách nào để lấy lại giá trị còn thiếu này không (ví dụ 8trong ví dụ trước của tôi)? ... lý tưởng với số lượng đối số thay đổi (như ziphiện).
LƯU Ý : Hiện tại tôi đã triển khai theo cách khác bằng cách sử dụng itertools.zip_longestnhưng tôi thực sự tự hỏi làm thế nào để có được giá trị còn thiếu này bằng cách sử dụng ziphoặc tương đương.
LƯU Ý 2 : Tôi đã tạo một số thử nghiệm về các triển khai khác nhau trong REPL này trong trường hợp bạn muốn gửi và thử triển khai mới :) https://repl.it/@jfthuong/MadPhysicistChester
zip()đã đọc 8từ gen1, nó đã biến mất.