如何在没有循环的情况下使用itertools group_by迭代器方法



Itertools::group_by是一种迭代方法,每次键函数都会改变新组。提供的示例显示了如何使用for循环使用它,但是在迭代链中使用输出GroupBy结构似乎很麻烦,除非我误解了某些东西:

let data = vec![1, 3, -2, -2, 1, 0, 1, 2];
// example from docs
for (key, group) in &data.into_iter().group_by(|elt| *elt >= 0) {
    assert_eq!(4, group.sum::<i32>().abs());
}
// usage in an iterator method chain
data.iter()
    .group_by(|elt| **elt >= 0)
    .into_iter()
    .map(|bool, group| (bool, group.collect::<Vec<i32>>()))
    .collect::<Vec<(bool, Vec<i32>)>>();

第二个示例未能编译:

error[E0619]: the type of this value must be known in this context
  --> src/main.rs:16:35
   |
16 |         .map(|bool, group| (bool, group.collect::<Vec<i32>>()))
   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0599]: no method named `collect` found for type `std::iter::Map<itertools::Groups<'_, bool, std::slice::Iter<'_, i32>, [closure@src/main.rs:14:19: 14:35]>, [closure@src/main.rs:16:14: 16:63]>` in the current scope
  --> src/main.rs:17:10
   |
17 |         .collect::<Vec<(bool, Vec<i32>)>>();
   |          ^^^^^^^
   |
   = note: the method `collect` exists but the following trait bounds were not satisfied:
           `std::iter::Map<itertools::Groups<'_, bool, std::slice::Iter<'_, i32>, [closure@src/main.rs:14:19: 14:35]>, [closure@src/main.rs:16:14: 16:63]> : std::iter::Iterator`
           `&mut std::iter::Map<itertools::Groups<'_, bool, std::slice::Iter<'_, i32>, [closure@src/main.rs:14:19: 14:35]>, [closure@src/main.rs:16:14: 16:63]> : std::iter::Iterator`
error[E0593]: closure takes 2 arguments but 1 argument is required
  --> src/main.rs:16:10
   |
16 |         .map(|bool, group| (bool, group.collect::<Vec<i32>>()))
   |          ^^^ ------------------------------------------------- takes 2 arguments
   |          |
   |          expected closure that takes 1 argument

我不信心我理解此错误,但是我认为编译器希望CLOSURE的group参数具有这种显式类型:

itertools::Group<'_, bool, std::slice::Iter<'_, i32>, [closure@srcmain.rs:26:15: 26:31]>

没人想要在他们的代码中,所以我希望我误解了。

问题是,是否可能以及如何使用 group_by而不a循环?

传递给map的闭合的参数数错误(两个而不是一个:使用元组);当然,错误消息不是很有帮助:)

另外,我也不会使用bool作为变量名称,并且您需要在收集整数引用之前(由于iter() vs.into_iter())。

游乐场

extern crate itertools;
use itertools::Itertools;
fn main() {
    let data = vec![1, 3, -2, -2, 1, 0, 1, 2];
    let groups = data.iter()
        .group_by(|elt| **elt >= 0)
        .into_iter()
        .map(|(ge0, group)| (ge0, group.cloned().collect()))
        .collect::<Vec<(bool, Vec<i32>)>>();
    println!("{:?}", groups);
}

最新更新