如何转置 Rust 中的向量向量? [英] How to transpose a vector of vectors in Rust?

查看:44
本文介绍了如何转置 Rust 中的向量向量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个 Vec,其中第一个向量按天数分组,内部向量按天数分组.我想以某种方式转置向量,先按天再按小时.在 Rust 中有没有一种简单的方法可以做到这一点?

So I have a Vec<Vec<T>> where the first vector groups by hours of day and the inner vector by days of week. I would like to transpose somehow the vectors to have it first by days then by hours. Is there a simple way to do it in Rust?

我的意思是,我知道如何使用 2 个 for 循环来实现,但是否有更智能/更短的方法来实现它的功能

I mean, I know how to do it with 2 for loops but is there a smarter/shorter way to do it functionally

推荐答案

你可以使用一些迭代器:

You can use some iterators:

fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>>
where
    T: Clone,
{
    assert!(!v.is_empty());
    (0..v[0].len())
        .map(|i| v.iter().map(|inner| inner[i].clone()).collect::<Vec<T>>())
        .collect()
}

正如 user4815162342 评论的那样,这是一个没有 Clone 的版本:

As user4815162342 comments, here is a version without Clone:

fn transpose2<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
    assert!(!v.is_empty());
    let len = v[0].len();
    let mut iters: Vec<_> = v.into_iter().map(|n| n.into_iter()).collect();
    (0..len)
        .map(|_| {
            iters
                .iter_mut()
                .map(|n| n.next().unwrap())
                .collect::<Vec<T>>()
        })
        .collect()
}

游乐场

这篇关于如何转置 Rust 中的向量向量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆