File tree Expand file tree Collapse file tree 2 files changed +56
-1
lines changed
test_python_toolbox/test_cute_iter_tools Expand file tree Collapse file tree 2 files changed +56
-1
lines changed Original file line number Diff line number Diff line change 77
88from __future__ import with_statement
99
10+ import collections
1011import itertools
1112import __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 ())
Original file line number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments