我有一个 Vec<Vec<T>>
,其中第一个向量按一天中的小时分组,内部向量按一周中的天分组。 我想要转置这些向量,先按天,然后再按小时排序。在Rust中有简单的方法吗?
编辑:我的意思是,我知道如何使用2个for循环来完成,但是否有更聪明/更短的函数式方法可以实现它。
我有一个 Vec<Vec<T>>
,其中第一个向量按一天中的小时分组,内部向量按一周中的天分组。 我想要转置这些向量,先按天,然后再按小时排序。在Rust中有简单的方法吗?
编辑:我的意思是,我知道如何使用2个for循环来完成,但是否有更聪明/更短的函数式方法可以实现它。
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
的版本:
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()
}
T: Clone
的版本,那将是很好的 - 也许通过排空内部向量。 - user4815162342这是一种方法
let v = vec![vec![1,2,3,4], vec![5,6,7,8]];
let rows = v.len();
let cols = v[0].len();
let transposed: Vec<Vec<_>> = (0..cols).map(|col| {
(0..rows)
.map(|row| v[row][col])
.collect()
}).collect();
fn transpose<T>(original: Vec<Vec<T>>) -> Vec<Vec<T>> {
assert!(!original.is_empty());
let mut transposed = (0..original[0].len()).map(|_| vec![]).collect::<Vec<_>>();
for original_row in original {
for (item, transposed_row) in original_row.into_iter().zip(&mut transposed) {
transposed_row.push(item);
}
}
transposed
}