Zip two finite iterators and pad the shorter one

Is there a standard library functions to zip two finite iterators and pad the shorter one.

For example given the following two iterators:
1->2->3
1->2->3->4->5

I would like to get:
(1,1)->(2,2)->(3,3)->(0,4)->(0,5)

You need itertools for this, see https://docs.rs/itertools/0.7.8/itertools/trait.Itertools.html#method.zip_longest

2 Likes

itertools is the way to go, but one can easily concoct this with a few lines of code. A naive example:

let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3, 4, 5];

let max_len = v1.len().max(v2.len());

let v1 = v1
	.into_iter()
	.chain(std::iter::repeat(Default::default()))
	.take(max_len);
let v2 = v2
	.into_iter()
	.chain(std::iter::repeat(Default::default()))
	.take(max_len);
	
let zipped = v1.zip(v2);

Put some of this in a helper fn or macro, and you’re all set :slight_smile:

2 Likes

That’s a clean solution. I didn’t think of using chain and take that way.

Thank you all :heart:

You could move the take(max_len) to zipped, e.g. let zipped = v1.zip(v2).take(max_len) which makes it more obvious and less error prone (DRY)

3 Likes