【问题标题】:How to create an iterator over Vec<Vec<T>> of unknown size that is equivalent of cartesian product of iterators over inner Vec<T>s?如何在未知大小的 Vec<Vec<T>> 上创建一个迭代器,该迭代器相当于内部 Vec<T> 上迭代器的笛卡尔积?
【发布时间】:2019-08-16 00:25:36
【问题描述】:

我想设计一个类似于示例here 的函数,除了在我的情况下,iproduct 的参数数量在编译时是未知的。正如here 解释的那样,这很容易在 python 中完成。

我曾尝试使用itertools crate,特别是iproduct!multi_cartesian_productcartesian_product,但目前正在与类型系统作斗争,并且不确定它是否是正确的路径。

pub fn product_of_lists(lists: &Vec<Vec<u16>>) -> std::slice::Iter<'_, u16> {
    // generate cross products between lists
    assert!(lists.len() > 2);
    let mut product_iter = lists[0].iter();
    for (en, list) in lists.iter().enumerate() {
        if en > 0{
            product_iter = iproduct!(product_iter, list.iter());
        }
    }
    product_iter
}
error[E0308]: mismatched types
  --> src/testcode.rs:44:28
   |
10 |             product_iter = iproduct!(product_iter, list.iter());
   |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::slice::Iter`, found struct `itertools::adaptors::Product`
   |
   = note: expected type `std::slice::Iter<'_, _>`
              found type `itertools::adaptors::Product<std::slice::Iter<'_, _>, std::slice::Iter<'_, u16>>`
   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

【问题讨论】:

    标签: rust iterator generator


    【解决方案1】:

    doc 已经回复你了:

    use itertools::Itertools; // 0.8.0
    
    pub fn product_of_lists(lists: &[Vec<u16>]) -> impl Iterator<Item = Vec<&u16>> {
        // generate cross products between lists
        assert!(lists.len() > 2);
        lists.iter().map(|x| x.iter()).multi_cartesian_product()
    }
    

    use itertools::Itertools; // 0.8.0
    
    pub fn product_of_lists<'a, L, I>(lists: L) -> impl Iterator<Item = Vec<&'a u16>>
    where
        L: IntoIterator<Item = I>,
        I: IntoIterator<Item = &'a u16>,
        <I as IntoIterator>::IntoIter: Clone,
    {
        lists
            .into_iter()
            .map(IntoIterator::into_iter)
            .multi_cartesian_product()
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2021-08-26
      • 2015-05-13
      • 2019-06-13
      • 2016-02-06
      相关资源
      最近更新 更多