我有一个像这样的过滤迭代器:
let filt_it = a_vector.iter().filter(|x| condition_on_x);
有没有办法可以找出它是否为空?
我需要保持迭代器的迭代器供以后使用,并且似乎无法克隆过滤的迭代器。
答案 0 :(得分:4)
您可以将迭代器peekable
和peek
作为第一项;如果它是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
,则该存储项也将被删除。