英文:
Can we use step in Rust slice?
问题
在Python中,我们可以获取奇数索引的子数组,如下所示:
odd = array[1::2]
在Rust中,我们可以使用简单的语法或任何特性来实现吗?像这样:
let vec = vec![1; 10];
let sli = &vec[1..10:2];
上述代码无法通过编译。
英文:
In python, we can get subarray in odd indexes like:
odd = array[1::2]
Can we do this in Rust, using simple syntax or any traits? like:
let vec = vec![1; 10];
let sli = &vec[0.2.10];
The above code cannot pass the compile.
答案1
得分: 6
不,一个slice是
对连续序列的动态大小视图
不过,你可以将原始切片的引用收集到一个Vec
中:
let odd: Vec<&i32> = array.iter().step_by(2).collect();
但对于许多应用程序,你甚至不需要完全collect
,可以直接使用Iterator
。
英文:
No, a slice is
> A dynamically-sized view into a contiguous sequence
You could collect references into the original slice into a Vec
though:
let odd: Vec<&i32> = array.iter().step_by(2).collect();
But for many applications you don't even need to collect
at all but can use the Iterator
directly.
答案2
得分: 6
Rust没有这个Python特性。但是,您可以使用.step_by()
方法对任何迭代器应用步长。
let v: Vec<i32> = (0..10).step_by(2).collect();
assert_eq!(v, vec![0, 2, 4, 6, 8]);
但是,请注意步长必须是正数,不像Python,其中负步长意味着倒着遍历列表。要在Rust中反转迭代器,通常可以使用.rev()
方法。
let v2: Vec<i32> = v.into_iter().rev().collect();
assert_eq!(v2, vec![8, 6, 4, 2, 0]);
如果您正在使用张量库,如ndarray,它将有自己的方式来使用步长进行切片,类似于这个ndarray宏。
英文:
Rust doesn't have this Python feature. However, you can apply a step size to any iterator by using the .step_by()
method.
let v: Vec<i32> = (0..10).step_by(2).collect();
assert_eq!(v, vec![0, 2, 4, 6, 8]);
However, note that the step size must be positive, unlike Python, where a negative step size means to walk the list backwards. To reverse an iterator in Rust, you can usually use .rev()
.
let v2: Vec<i32> = v.into_iter().rev().collect();
assert_eq!(v2, vec![8, 6, 4, 2, 0]);
If you're using a tensor library, like ndarray, it'll have its own way of slicing with a step size, like this ndarray macro.
答案3
得分: 1
Rust切片语法不支持。
您可以通过使用.iter()
方法与.enumerate()
和.filter()
方法来创建一个迭代器,仅产生奇数索引处的元素。如果您需要结果是一个Vec
,那么您可以将这个迭代器收集到一个Vec
中,
let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odd: Vec<_> = vec.iter()
.enumerate()
.filter(|&(i, _)| i % 2 != 0)
.map(|(_, e)| e)
.collect();
println!("{:?}", odd);
请注意,索引是从0开始的,因此这会给您原始向量的偶数元素的奇数索引处的元素。如果您想要偶数索引处的元素,您可以将i % 2 != 0
更改为i % 2 == 0
。
英文:
No,Rust slicing syntax does not support.
you can achieve it by using the .iter()
method with the .enumerate()
and .filter()
methods to create an iterator that only yields elements at odd indices. If you need the result to be a Vec
, you can then collect this iterator into a Vec
,
let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odd: Vec<_> = vec.iter()
.enumerate()
.filter(|&(i, _)| i % 2 != 0)
.map(|(_, e)| e)
.collect();
println!("{:?}", odd);
Note that the indices are 0-based, so this gives you elements at odd indices, which are the even elements of the original vector. If you want the elements at even indices, you can change i % 2 != 0 to i % 2 == 0
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论