Skip to content

Commit 7146583

Browse files
committed
-
1 parent 4f03be5 commit 7146583

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

python_toolbox/cute_iter_tools.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from __future__ import with_statement
99

10+
import collections
1011
import itertools
1112
import __builtin__
1213

@@ -199,4 +200,40 @@ def get_items(iterable, n):
199200
If there are less than `n` items, no exception will be raised. Whatever
200201
items are there will be returned.
201202
'''
202-
return tuple(shorten(iterable, n))
203+
return tuple(shorten(iterable, n))
204+
205+
206+
def double_filter(filter_function, iterable):
207+
iterator = iter(iterable)
208+
209+
true_deque = collections.deque()
210+
false_deque = collections.deque()
211+
212+
def process_value():
213+
value = next(iterator)
214+
if filter_function(value):
215+
true_deque.append(value)
216+
else:
217+
false_deque.append(value)
218+
219+
def make_true_iterator():
220+
while True:
221+
try:
222+
yield true_deque.popleft()
223+
except IndexError:
224+
try:
225+
process_value()
226+
except StopIteration:
227+
break
228+
229+
def make_false_iterator():
230+
while True:
231+
try:
232+
yield false_deque.popleft()
233+
except IndexError:
234+
try:
235+
process_value()
236+
except StopIteration:
237+
break
238+
239+
return (make_true_iterator(), make_false_iterator())
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Copyright 2009-2013 Ram Rachum.
2+
# This program is distributed under the MIT license.
3+
4+
from python_toolbox.cute_iter_tools import double_filter
5+
6+
7+
def test_double_filter():
8+
9+
(first_iterable, second_iterable) = \
10+
double_filter(lambda value: value % 2 == 0, xrange(20))
11+
assert tuple(first_iterable) == tuple(xrange(0, 20, 2))
12+
assert tuple(second_iterable) == tuple(xrange(1, 20, 2))
13+
14+
(first_iterable, second_iterable) = \
15+
double_filter(lambda value: value % 3 == 0, xrange(20))
16+
assert tuple(first_iterable) == tuple(xrange(0, 20, 3))
17+
assert tuple(second_iterable) == tuple(i for i in xrange(20) if i % 3 != 0)
18+

0 commit comments

Comments
 (0)