是否可以在 Rust 中使用“.map()”将函数应用于嵌套向量的每个元素?

Is it possible to apply a function using `.map()` to every element of a nested vector in Rust?

提问人:FreelanceConsultant 提问时间:9/3/2023 更新时间:9/3/2023 访问量:51

问:

是否可以将闭包或函数应用于 ?Vec<Vec<T>>

这可以用吗?如果没有,那么有没有其他选择?.map()

我想将 a 转换为 .关于如何做到这一点,我的第一个想法是使用加闭合。Vec<Vec<Option<f64>>>Vec<Vec<f64>>.map()

当我尝试这样做时,我发现这不是正确的方法,因为这适用于第一个元素的每个元素,而这些元素本身就是 s。.iter().map(f)fVecVec

我也进行了调查,但这会产生一个包含所有元素的元素,这些元素会“破坏”我需要保留的二维结构。iter().flatten()Vec<T>Vec<Vec<T>>

我想一种可能的方法是使 to 的闭包逻辑成为它本身调用的东西,所需的转换从 .但这可能有点不优雅。fiter().map(g)gOption<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

你很接近,但不是在外部应用它,我们可以映射在外部并应用在内部。flattenVecVecflattenVec<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]]