提问人:FreelanceConsultant 提问时间:9/3/2023 更新时间:9/3/2023 访问量:51
是否可以在 Rust 中使用“.map()”将函数应用于嵌套向量的每个元素?
Is it possible to apply a function using `.map()` to every element of a nested vector in Rust?
问:
是否可以将闭包或函数应用于 ?Vec<Vec<T>>
这可以用吗?如果没有,那么有没有其他选择?.map()
我想将 a 转换为 .关于如何做到这一点,我的第一个想法是使用加闭合。Vec<Vec<Option<f64>>>
Vec<Vec<f64>>
.map()
当我尝试这样做时,我发现这不是正确的方法,因为这适用于第一个元素的每个元素,而这些元素本身就是 s。.iter().map(f)
f
Vec
Vec
我也进行了调查,但这会产生一个包含所有元素的元素,这些元素会“破坏”我需要保留的二维结构。iter().flatten()
Vec<T>
Vec<Vec<T>>
我想一种可能的方法是使 to 的闭包逻辑成为它本身调用的东西,所需的转换从 .但这可能有点不优雅。f
iter().map(g)
g
Option<f64> -> f64
答:
2赞
Chris
9/3/2023
#1
是的,这是可能的:
fn main() {
let vec = vec![vec![Some(1.), None, Some(2.)]];
let vec2 = vec.iter().map(|inner_vec| {
inner_vec.iter().map(|option| {
option.unwrap_or(0.)
}).collect::<Vec<_>>()
}).collect::<Vec<_>>();
println!("vec2: {:?}", vec2);
}
// Program output:
// vec2: [[1.0, 0.0, 2.0]]
基本上,您可以遍历最外层的 Vec 并映射其元素。这些元素是内部 vec,您可以(再次)遍历并映射其元素。然后,您可以对内部应用一些操作,例如,然后再次将两个级别的嵌套重新收集回 Vecs 中。Option<f64>
.unwrap_or(0.)
1赞
Marimuthu Madasamy
9/3/2023
#2
你很接近,但不是在外部应用它,我们可以映射在外部并应用在内部。flatten
Vec
Vec
flatten
Vec<Option<f64>>
let nested_option_numbers: Vec<Vec<Option<f64>>> = vec![
vec![Some(3.0), None, Some(5.0)],
vec![Some(1.0), Some(2.0), None],
vec![None, Some(4.0)],
];
let nested_numbers: Vec<Vec<f64>> = nested_option_numbers
.iter()
.map(|option_numbers| option_numbers.iter().flatten().cloned().collect())
.collect();
println!("{nested_numbers:?}");
这打印 .[[3.0, 5.0], [1.0, 2.0], [4.0]]
评论