tôi nhận thấy rằng itertools
không (có vẻ như với tôi) có một chức năng có khả năng của các yếu tố interleaving từ một số đối tượng iterable khác (như trái ngược với nén chúng):Python có chức năng tích hợp cho các trình tạo/trình tự xen kẽ không?
def leaf(*args): return (it.next() for it in cycle(imap(chain,args)))
tuple(leaf(['Johann', 'Sebastian', 'Bach'], repeat(' '))) => ('Johann', ' ', 'Sebastian', ' ', 'Bach', ' ')
(Chỉnh sửa) Lý do tôi hỏi là vì Tôi muốn tránh những lần xuất hiện zip/flatten không cần thiết. Rõ ràng, định nghĩa của leaf
là đủ đơn giản, nhưng nếu có một chức năng được xác định trước làm điều tương tự, tôi muốn sử dụng nó, hoặc một biểu thức máy phát rất rõ ràng. Có một chức năng như vậy được xây dựng trong, trong itertools, hoặc trong một số thư viện nổi tiếng khác, hoặc một biểu thức thành ngữ phù hợp?
Chỉnh sửa 2: Một định nghĩa thậm chí ngắn gọn hơn là có thể (bằng cách sử dụng functional
gói):
from itertools import *
from functional import *
compose_mult = partial(reduce, compose)
leaf = compose_mult((partial(imap, next), cycle, partial(imap, chain), lambda *args: args))
Trong một lưu ý hoàn toàn không liên quan, tôi không thể không đề cập đến việc Bạch được đề cập là Johann, chứ không phải John. – 9000
@ 9000: Khá - điều này đã rơi ra khỏi một bài kiểm tra đơn vị mà tôi lơ đãng viết nó vì nó là – Marcin