如何将两个 Rust 向量按三个块交错成一个新向量?
Posted
技术标签:
【中文标题】如何将两个 Rust 向量按三个块交错成一个新向量?【英文标题】:How do I interleave two Rust vectors by chunks of threes into a new vector? 【发布时间】: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 编写这个迭代器?
【问题讨论】:
【参考方案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 -> 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);
【讨论】:
以上是关于如何将两个 Rust 向量按三个块交错成一个新向量?的主要内容,如果未能解决你的问题,请参考以下文章