【问题标题】:How do I interleave two Rust vectors by chunks of threes into a new vector?如何将两个 Rust 向量按三个块交错成一个新向量?
【发布时间】:2020-04-06 22:05:49
【问题描述】:

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

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 编写这个迭代器?

【问题讨论】:

    标签: vector rust itertools interleave


    【解决方案1】:

    似乎只有 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 -&gt; chain 的行为类似于 interleave

    【讨论】:

      【解决方案2】:

      你想要Iterator::flatten:

      use itertools::interleave;
      
      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 v = interleave(v1.chunks(3), v2.chunks(3))
              .flatten()
              .collect::<Vec<_>>();
          dbg!(v);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多