如何将两个 Rust 向量按三块交织成一个新向量?

2023-12-28

我需要一种惯用的方式来交错这两个向量:

let v1 = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let v2 = vec![7.0, 8.0, 9.0, 10.0, 11.0, 12.0];

我期望的输出是:

[1.0, 2.0, 3.0,
 7.0, 8.0, 9.0,
 4.0, 5.0, 6.0,
 10.0, 11.0, 12.0];

我使用了itertoolschunks方法,但我不认为这是最好的实现,因为有两个collect calls.

let output = interleave(&v1.into_iter().chunks(3), &v2.into_iter().chunks(3)).map(|v| {v.into_iter().collect::<Vec<f32>>()}).flatten().collect::<Vec<f32>>();

有没有更好的方法使用 itertools 编写这个迭代器?


似乎仅使用 std 即可实现相同的效果:

fn main() {
    let v1 = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
    let v2 = vec![7.0, 8.0, 9.0, 10.0, 11.0, 12.0];

    let v3: Vec<f64> = v1.chunks(3)
        .zip(v2.chunks(3)) // yields items like (&[1.0, 2.0, 3.0], &[7.0, 8.0, 9.0])
        .flat_map(|(a, b)| a.into_iter().chain(b)) // chains to produce iterators like [1.0, 2.0, 3.0, 7.0, 8.0, 9.0]
        .copied() // &f64 -> f64, optional
        .collect();

    println!("v3 is {:?}", v3);
}

I.e. zip -> chain行为就像interleave.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将两个 Rust 向量按三块交织成一个新向量? 的相关文章

随机推荐