vector - 如何将两个 Rust 向量以三个为一组交织成一个新向量?

标签 vector rust interleave rust-itertools

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

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];

我使用了 itertools chunks 方法,但我不认为这是最好的实现,因为有两个 collect 调用。

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);
}

zip -> chain 的行为类似于 interleave

关于vector - 如何将两个 Rust 向量以三个为一组交织成一个新向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59322812/

相关文章:

c++ - 从具有基类 ptr 的 vector 中删除

C++ std::vector 迭代器错误

rust - 调用 Option::unwrap 时无法移出 `&mut` 指针的取消引用

rust - 从 Option 借来的 RefMut 生命周期不够长 (Option<Rc<RefCell<Node>>>)

vector - 如何在 APL 中交错两个给定向量

c++ - 如何使用 operator[] 访问结构的指定字段值

c++ - 用 int 和 Points 对 vector 进行排序

rust - 为什么使用外部包装箱的功能需要将依赖特征纳入范围?

r - 每 n 个元素之后交错列表

string - 确定序列是否是两个字符串重复的交错