Commit 61bd06c7 authored by Alex Koren's avatar Alex Koren Committed by Dylan Trotter

more itertools defined (#15)

* added compress, cycle, dropwhile, from_iterable, ifilter, ifilterfalse, and takewhile in itertools
* added itertools tests for cycle, dropwhile, from_iterable, ifilter, ifilterfalse, takewhile
parent c8ba5aa2
build build
errors.err errors.err
*.swp *.swp
*.pyc
...@@ -17,12 +17,13 @@ ...@@ -17,12 +17,13 @@
import _collections import _collections
import sys import sys
def chain(*iterables): def chain(*iterables):
for it in iterables: for it in iterables:
for element in it: for element in it:
yield element yield element
def compress(data, selectors):
return (d for d,s in izip(data, selectors) if s)
def count(start=0, step=1): def count(start=0, step=1):
n = start n = start
...@@ -30,6 +31,42 @@ def count(start=0, step=1): ...@@ -30,6 +31,42 @@ def count(start=0, step=1):
yield n yield n
n += step n += step
def cycle(iterable):
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
def dropwhile(predicate, iterable):
iterable = iter(iterable)
for x in iterable:
if not predicate(x):
yield x
break
for x in iterable:
yield x
def from_iterable(iterables):
for it in iterables:
for element in it:
yield element
def ifilter(predicate, iterable):
if predicate is None:
predicate = bool
for x in iterable:
if predicate(x):
yield x
def ifilterfalse(predicate, iterable):
if predicate is None:
predicate = bool
for x in iterable:
if not predicate(x):
yield x
def imap(function, *iterables): def imap(function, *iterables):
iterables = map(iter, iterables) iterables = map(iter, iterables)
...@@ -40,7 +77,6 @@ def imap(function, *iterables): ...@@ -40,7 +77,6 @@ def imap(function, *iterables):
else: else:
yield function(*args) yield function(*args)
def islice(iterable, *args): def islice(iterable, *args):
s = slice(*args) s = slice(*args)
it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or 1)) it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or 1))
...@@ -50,13 +86,11 @@ def islice(iterable, *args): ...@@ -50,13 +86,11 @@ def islice(iterable, *args):
yield element yield element
nexti = next(it) nexti = next(it)
def izip(*iterables): def izip(*iterables):
iterators = map(iter, iterables) iterators = map(iter, iterables)
while iterators: while iterators:
yield tuple(map(next, iterators)) yield tuple(map(next, iterators))
def repeat(object, times=None): def repeat(object, times=None):
if times is None: if times is None:
while True: while True:
...@@ -65,11 +99,16 @@ def repeat(object, times=None): ...@@ -65,11 +99,16 @@ def repeat(object, times=None):
for i in xrange(times): for i in xrange(times):
yield object yield object
def starmap(function, iterable): def starmap(function, iterable):
for args in iterable: for args in iterable:
yield function(*args) yield function(*args)
def takewhile(predicate, iterable):
for x in iterable:
if predicate(x):
yield x
else:
break
def tee(iterable, n=2): def tee(iterable, n=2):
it = iter(iterable) it = iter(iterable)
......
...@@ -16,6 +16,70 @@ import itertools ...@@ -16,6 +16,70 @@ import itertools
import weetest import weetest
def TestCycle():
want = []
got = []
for x in itertools.cycle(()):
got.append(x)
assert got == want, 'empty cycle yields no elements'
arg = (0, 1, 2)
want = (0, 1, 2) * 10
got = []
limit = 10 * len(arg)
counter = 0
for x in itertools.cycle((0, 1, 2)):
got.append(x)
counter += 1
if counter == limit:
break
assert tuple(got) == want, 'tuple(cycle%s) == %s, want %s' % (arg, tuple(got), want)
def TestDropwhile():
r = range(10)
cases = [
((lambda x: x < 5, r), (5, 6, 7, 8, 9)),
((lambda x: True, r), ()),
((lambda x: False, r), tuple(r)),
]
for args, want in cases:
got = tuple(itertools.dropwhile(*args))
assert got == want, 'tuple(dropwhile%s) == %s, want %s' % (args, got, want)
def TestFromIterable():
r = range(10)
cases = [
([r], tuple(r)),
([r, r], tuple(r) + tuple(r)),
([], ())
]
for args, want in cases:
got = tuple(itertools.from_iterable(args))
assert got == want, 'tuple(from_iterable%s) == %s, want %s' % (args, got, want)
def TestIFilter():
r = range(10)
cases = [
((lambda x: x < 5, r), (0, 1, 2, 3, 4)),
((lambda x: False, r), ()),
((lambda x: True, r), tuple(r)),
((None, r), (1, 2, 3, 4, 5, 6, 7, 8, 9))
]
for args, want in cases:
got = tuple(itertools.ifilter(*args))
assert got == want, 'tuple(ifilter%s) == %s, want %s' % (args, got, want)
def TestIFilterFalse():
r = range(10)
cases = [
((lambda x: x < 5, r), (5, 6, 7, 8, 9)),
((lambda x: False, r), tuple(r)),
((lambda x: True, r), ()),
((None, r), (0,))
]
for args, want in cases:
got = tuple(itertools.ifilterfalse(*args))
assert got == want, 'tuple(ifilterfalse%s) == %s, want %s' % (args, got, want)
def TestISlice(): def TestISlice():
r = range(10) r = range(10)
...@@ -28,6 +92,16 @@ def TestISlice(): ...@@ -28,6 +92,16 @@ def TestISlice():
got = tuple(itertools.islice(*args)) got = tuple(itertools.islice(*args))
assert got == want, 'tuple(islice%s) == %s, want %s' % (args, got, want) assert got == want, 'tuple(islice%s) == %s, want %s' % (args, got, want)
def TestTakewhile():
r = range(10)
cases = [
((lambda x: x % 2 == 0, r), (0,)),
((lambda x: True, r), tuple(r)),
((lambda x: False, r), ())
]
for args, want in cases:
got = tuple(itertools.takewhile(*args))
assert got == want, 'tuple(takewhile%s) == %s, want %s' % (args, got, want)
if __name__ == '__main__': if __name__ == '__main__':
weetest.RunTests() weetest.RunTests()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment