63

Python list comprehension is really simple:

>>> l = [x for x in range(1, 10) if x % 2 == 0]
>>> [2, 4, 6, 8] 

Does Rust have an equivalent syntax like:

let vector = vec![x for x in (1..10) if x % 2 == 0]
// [2, 4, 6, 8]
Darkaird
  • 2,700
  • 4
  • 15
  • 29

4 Answers4

85

You can just use iterators:

fn main() {
    let v1 = (0u32..9).filter(|x| x % 2 == 0).map(|x| x.pow(2)).collect::<Vec<_>>();
    let v2 = (1..10).filter(|x| x % 2 == 0).collect::<Vec<u32>>();

    println!("{:?}", v1); // [0, 4, 16, 36, 64]
    println!("{:?}", v2); // [2, 4, 6, 8]
}
ljedrz
  • 20,316
  • 4
  • 69
  • 97
63

cute is a macro for Python-esque list and dictionary (HashMap) comprehensions in Rust.

use cute::c;

let vector = c![x, for x in 1..10, if x % 2 == 0];
Jacob Krall
  • 28,341
  • 6
  • 66
  • 76
  • 3
    I had already seen this and found it really interesting but what I want is more a built-in function/syntax like @ljedrz answered. – Darkaird Jul 24 '17 at 14:31
  • 9
    @Darkaird rust has a fairly lean std lib so you might not get far without additional crates. – the8472 Jul 24 '17 at 17:52
  • 1
    `use cute::c;` now works in place of the 1st two lines. Strangely the `cute` manual does not mention this. The manual on changes to the use of `extern` does https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html – ctrl-alt-delor Sep 08 '22 at 20:43
-1

For anyone else looking for a python-like list\dict comprehension:

list_comprehension_macro

Python:

even_squares = [x for x in range(1, 10) if x % 2 == 0]

Rust equivalent:

let even_squares = comp![x for x in (1..10) if x % 2 == 0]

Full example

In cargo.toml:

list_comprehension_macro = "*"

Then:

use list_comprehension_macro::comp;
fn main() {
    let arr: Vec<u32> = vec![1, 2, 3, 4];
    let result = comp![x * 2 for x in arr];
}
-2

Since rust 2018, you can do:

use cute::c;
…

let vector = c![x, for x in 1..10, if x % 2 == 0];

see https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html for why.

ctrl-alt-delor
  • 7,506
  • 5
  • 40
  • 52
  • This is better left as a comment on the answer already suggesting this crate since this doesn't provide anything new to the original question. – kmdreko Sep 08 '22 at 21:34
  • I should also point out that `#[macro_use] extern crate cute;` is the "more correct" way to import the crate since even the most recent published version uses the 2015 edition. It just happens that the modern way to import also works because the macro is self-contained and doesn't rely on other items in the crate. Trying this on other 2015 edition crates with macros may not work. – kmdreko Sep 08 '22 at 21:34