我可以找出过滤后的迭代器是否为空?

时间:2018-02-13 23:11:38

标签: rust

我有一个像这样的过滤迭代器:

let filt_it = a_vector.iter().filter(|x| condition_on_x);

有没有办法可以找出它是否为空?

我需要保持迭代器的迭代器供以后使用,并且似乎无法克隆过滤的迭代器。

1 个答案:

答案 0 :(得分:4)

您可以将迭代器peekablepeek作为第一项;如果它是df.shape[0] - df[['col_a','col_b']].duplicated().sum(),则迭代器为空。 774 µs ± 603 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)不使用 1 项,因此下一次调用next将返回它。但是,None会使用迭代器,因此您必须传递peek - 但peekable也是Peekable,因此如果您的代码需要{{1}或者Peekable,它会正常工作。

Iterator
当迭代器和谓词函数都是Iterator时,

Filter implements Clone。问题是,从Rust 1.23.0开始,闭包不会实现IntoIterator。你可以在夜间编译器上enable a feature,这样可以let filt_it = a_vector.iter().filter(|x| condition_on_x).peekable(); if filt_it.peek().is_some() { // The iterator is not empty, process it. process(filt_it); } 的闭包就可以了。

1 如果您使用mutable reference to your iterator拨打Clone,则可以在删除Clone后保留原始迭代器。但是,如果在删除Clone之前调用了peekable,则会看到它实际上消耗了原始迭代器中的第一个项目。这完全正常; Peekable本身不提供偷看的界面。 peek将存储偷看项目,以便它可以在以下对Peekable的调用中将其返回,但如果您删除Iterator,则该存储项也将被删除。