blob: 1a3064c3051b259661cb30a6ae0c4cef75df2943 [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
2from test import test_support
3from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger2012f172003-02-07 05:32:58 +00005import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00006import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00007import random
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +00008maxsize = test_support.MAX_Py_ssize_t
9minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000010
11def onearg(x):
12 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000013 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000014
15def errfunc(*args):
16 'Test function that raises an error'
17 raise ValueError
18
19def gen3():
20 'Non-restartable source sequence'
21 for i in (0, 1, 2):
22 yield i
23
24def isEven(x):
25 'Test predicate'
26 return x%2==0
27
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000028def isOdd(x):
29 'Test predicate'
30 return x%2==1
31
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000032class StopNow:
33 'Class emulating an empty iterable.'
34 def __iter__(self):
35 return self
36 def next(self):
37 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000038
Raymond Hettinger02420702003-06-29 20:36:23 +000039def take(n, seq):
40 'Convenience function for partially consuming a long of infinite iterable'
41 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000042
Raymond Hettinger96ef8112003-02-01 00:10:11 +000043class TestBasicOps(unittest.TestCase):
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000044 def test_chain(self):
45 self.assertEqual(list(chain('abc', 'def')), list('abcdef'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000046 self.assertEqual(list(chain('abc')), list('abc'))
47 self.assertEqual(list(chain('')), [])
Raymond Hettinger02420702003-06-29 20:36:23 +000048 self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049 self.assertRaises(TypeError, chain, 2, 3)
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000050
Raymond Hettinger96ef8112003-02-01 00:10:11 +000051 def test_count(self):
52 self.assertEqual(zip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
53 self.assertEqual(zip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
Raymond Hettinger02420702003-06-29 20:36:23 +000054 self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
Raymond Hettinger50e90e22007-10-04 00:20:27 +000055 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
56 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger96ef8112003-02-01 00:10:11 +000057 self.assertRaises(TypeError, count, 2, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000058 self.assertRaises(TypeError, count, 'a')
Raymond Hettinger50e90e22007-10-04 00:20:27 +000059 self.assertEqual(list(islice(count(maxsize-5), 10)), range(maxsize-5, maxsize+5))
60 self.assertEqual(list(islice(count(-maxsize-5), 10)), range(-maxsize-5, -maxsize+5))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000061 c = count(3)
62 self.assertEqual(repr(c), 'count(3)')
63 c.next()
64 self.assertEqual(repr(c), 'count(4)')
Jack Diederich36234e82006-09-21 17:50:26 +000065 c = count(-9)
66 self.assertEqual(repr(c), 'count(-9)')
67 c.next()
68 self.assertEqual(c.next(), -8)
Raymond Hettinger50e90e22007-10-04 00:20:27 +000069 for i in (-sys.maxint-5, -sys.maxint+5 ,-10, -1, 0, 10, sys.maxint-5, sys.maxint+5):
Raymond Hettinger3a0de082007-10-12 17:53:11 +000070 # Test repr (ignoring the L in longs)
71 r1 = repr(count(i)).replace('L', '')
72 r2 = 'count(%r)'.__mod__(i).replace('L', '')
73 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +000074
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000075 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +000076 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000077 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000078 self.assertRaises(TypeError, cycle)
79 self.assertRaises(TypeError, cycle, 5)
80 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +000081
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000082 def test_groupby(self):
83 # Check whether it accepts arguments correctly
84 self.assertEqual([], list(groupby([])))
85 self.assertEqual([], list(groupby([], key=id)))
86 self.assertRaises(TypeError, list, groupby('abc', []))
87 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +000088 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000089
90 # Check normal input
91 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
92 (2,15,22), (3,16,23), (3,17,23)]
93 dup = []
94 for k, g in groupby(s, lambda r:r[0]):
95 for elem in g:
96 self.assertEqual(k, elem[0])
97 dup.append(elem)
98 self.assertEqual(s, dup)
99
100 # Check nested case
101 dup = []
102 for k, g in groupby(s, lambda r:r[0]):
103 for ik, ig in groupby(g, lambda r:r[2]):
104 for elem in ig:
105 self.assertEqual(k, elem[0])
106 self.assertEqual(ik, elem[2])
107 dup.append(elem)
108 self.assertEqual(s, dup)
109
110 # Check case where inner iterator is not used
111 keys = [k for k, g in groupby(s, lambda r:r[0])]
112 expectedkeys = set([r[0] for r in s])
113 self.assertEqual(set(keys), expectedkeys)
114 self.assertEqual(len(keys), len(expectedkeys))
115
116 # Exercise pipes and filters style
117 s = 'abracadabra'
118 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000119 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000120 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
121 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000122 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000123 self.assertEqual(r, ['a', 'b', 'r'])
124 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000125 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000126 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
127 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000128 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000129 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
130
131 # iter.next failure
132 class ExpectedError(Exception):
133 pass
134 def delayed_raise(n=0):
135 for i in range(n):
136 yield 'yo'
137 raise ExpectedError
138 def gulp(iterable, keyp=None, func=list):
139 return [func(g) for k, g in groupby(iterable, keyp)]
140
141 # iter.next failure on outer object
142 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
143 # iter.next failure on inner object
144 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
145
146 # __cmp__ failure
147 class DummyCmp:
148 def __cmp__(self, dst):
149 raise ExpectedError
150 s = [DummyCmp(), DummyCmp(), None]
151
152 # __cmp__ failure on outer object
153 self.assertRaises(ExpectedError, gulp, s, func=id)
154 # __cmp__ failure on inner object
155 self.assertRaises(ExpectedError, gulp, s)
156
157 # keyfunc failure
158 def keyfunc(obj):
159 if keyfunc.skip > 0:
160 keyfunc.skip -= 1
161 return obj
162 else:
163 raise ExpectedError
164
165 # keyfunc failure on outer object
166 keyfunc.skip = 0
167 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
168 keyfunc.skip = 1
169 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
170
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000171 def test_ifilter(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000172 self.assertEqual(list(ifilter(isEven, range(6))), [0,2,4])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000173 self.assertEqual(list(ifilter(None, [0,1,0,2,0])), [1,2])
Raymond Hettinger02420702003-06-29 20:36:23 +0000174 self.assertEqual(take(4, ifilter(isEven, count())), [0,2,4,6])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000175 self.assertRaises(TypeError, ifilter)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000176 self.assertRaises(TypeError, ifilter, lambda x:x)
177 self.assertRaises(TypeError, ifilter, lambda x:x, range(6), 7)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000178 self.assertRaises(TypeError, ifilter, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000179 self.assertRaises(TypeError, ifilter(range(6), range(6)).next)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000180
181 def test_ifilterfalse(self):
Raymond Hettinger60eca932003-02-09 06:40:58 +0000182 self.assertEqual(list(ifilterfalse(isEven, range(6))), [1,3,5])
183 self.assertEqual(list(ifilterfalse(None, [0,1,0,2,0])), [0,0,0])
Raymond Hettinger02420702003-06-29 20:36:23 +0000184 self.assertEqual(take(4, ifilterfalse(isEven, count())), [1,3,5,7])
Raymond Hettinger60eca932003-02-09 06:40:58 +0000185 self.assertRaises(TypeError, ifilterfalse)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000186 self.assertRaises(TypeError, ifilterfalse, lambda x:x)
187 self.assertRaises(TypeError, ifilterfalse, lambda x:x, range(6), 7)
Raymond Hettinger60eca932003-02-09 06:40:58 +0000188 self.assertRaises(TypeError, ifilterfalse, isEven, 3)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000189 self.assertRaises(TypeError, ifilterfalse(range(6), range(6)).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000190
191 def test_izip(self):
192 ans = [(x,y) for x, y in izip('abc',count())]
193 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000194 self.assertEqual(list(izip('abc', range(6))), zip('abc', range(6)))
195 self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
Raymond Hettinger02420702003-06-29 20:36:23 +0000196 self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000197 self.assertEqual(list(izip('abcdef')), zip('abcdef'))
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000198 self.assertEqual(list(izip()), zip())
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000199 self.assertRaises(TypeError, izip, 3)
200 self.assertRaises(TypeError, izip, range(3), 3)
201 # Check tuple re-use (implementation detail)
202 self.assertEqual([tuple(list(pair)) for pair in izip('abc', 'def')],
203 zip('abc', 'def'))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000204 self.assertEqual([pair for pair in izip('abc', 'def')],
205 zip('abc', 'def'))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000206 ids = map(id, izip('abc', 'def'))
207 self.assertEqual(min(ids), max(ids))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000208 ids = map(id, list(izip('abc', 'def')))
209 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000210
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000211 def test_iziplongest(self):
212 for args in [
213 ['abc', range(6)],
214 [range(6), 'abc'],
215 [range(1000), range(2000,2100), range(3000,3050)],
216 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
217 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
218 ]:
219 target = map(None, *args)
220 self.assertEqual(list(izip_longest(*args)), target)
221 self.assertEqual(list(izip_longest(*args, **{})), target)
222 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
223 self.assertEqual(list(izip_longest(*args, **dict(fillvalue='X'))), target)
Tim Petersea5962f2007-03-12 18:07:52 +0000224
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000225 self.assertEqual(take(3,izip_longest('abcdef', count())), zip('abcdef', range(3))) # take 3 from infinite input
226
227 self.assertEqual(list(izip_longest()), zip())
228 self.assertEqual(list(izip_longest([])), zip([]))
229 self.assertEqual(list(izip_longest('abcdef')), zip('abcdef'))
Tim Petersea5962f2007-03-12 18:07:52 +0000230
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000231 self.assertEqual(list(izip_longest('abc', 'defg', **{})), map(None, 'abc', 'defg')) # empty keyword dict
232 self.assertRaises(TypeError, izip_longest, 3)
233 self.assertRaises(TypeError, izip_longest, range(3), 3)
234
235 for stmt in [
236 "izip_longest('abc', fv=1)",
Tim Petersea5962f2007-03-12 18:07:52 +0000237 "izip_longest('abc', fillvalue=1, bogus_keyword=None)",
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000238 ]:
239 try:
240 eval(stmt, globals(), locals())
241 except TypeError:
242 pass
243 else:
244 self.fail('Did not raise Type in: ' + stmt)
Tim Petersea5962f2007-03-12 18:07:52 +0000245
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000246 # Check tuple re-use (implementation detail)
247 self.assertEqual([tuple(list(pair)) for pair in izip_longest('abc', 'def')],
248 zip('abc', 'def'))
249 self.assertEqual([pair for pair in izip_longest('abc', 'def')],
250 zip('abc', 'def'))
251 ids = map(id, izip_longest('abc', 'def'))
252 self.assertEqual(min(ids), max(ids))
253 ids = map(id, list(izip_longest('abc', 'def')))
254 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
255
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000256 def test_repeat(self):
257 self.assertEqual(zip(xrange(3),repeat('a')),
258 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000259 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000260 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000261 self.assertEqual(list(repeat('a', 0)), [])
262 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000263 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000264 self.assertRaises(TypeError, repeat, None, 3, 4)
265 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000266 r = repeat(1+0j)
267 self.assertEqual(repr(r), 'repeat((1+0j))')
268 r = repeat(1+0j, 5)
269 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
270 list(r)
271 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000272
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000273 def test_imap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000274 self.assertEqual(list(imap(operator.pow, range(3), range(1,7))),
275 [0**1, 1**2, 2**3])
276 self.assertEqual(list(imap(None, 'abc', range(5))),
277 [('a',0),('b',1),('c',2)])
Raymond Hettinger02420702003-06-29 20:36:23 +0000278 self.assertEqual(list(imap(None, 'abc', count())),
279 [('a',0),('b',1),('c',2)])
280 self.assertEqual(take(2,imap(None, 'abc', count())),
281 [('a',0),('b',1)])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000282 self.assertEqual(list(imap(operator.pow, [])), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000283 self.assertRaises(TypeError, imap)
284 self.assertRaises(TypeError, imap, operator.neg)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000285 self.assertRaises(TypeError, imap(10, range(5)).next)
286 self.assertRaises(ValueError, imap(errfunc, [4], [5]).next)
287 self.assertRaises(TypeError, imap(onearg, [4], [5]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000288
289 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000290 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
291 [0**1, 1**2, 2**3])
Raymond Hettinger02420702003-06-29 20:36:23 +0000292 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
293 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000294 self.assertEqual(list(starmap(operator.pow, [])), [])
Raymond Hettinger2012f172003-02-07 05:32:58 +0000295 self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000296 self.assertRaises(TypeError, starmap)
297 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
298 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
299 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
300 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000301
302 def test_islice(self):
303 for args in [ # islice(args) should agree with range(args)
304 (10, 20, 3),
305 (10, 3, 20),
306 (10, 20),
307 (10, 3),
308 (20,)
309 ]:
310 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
311
312 for args, tgtargs in [ # Stop when seqn is exhausted
313 ((10, 110, 3), ((10, 100, 3))),
314 ((10, 110), ((10, 100))),
315 ((110,), (100,))
316 ]:
317 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
318
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000319 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000320 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000321 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
322 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000323 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
324 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
325
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000326 # Test number of items consumed SF #1171417
327 it = iter(range(10))
328 self.assertEqual(list(islice(it, 3)), range(3))
329 self.assertEqual(list(it), range(3, 10))
330
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000331 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000332 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000333 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
334 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
335 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
336 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
337 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000338 self.assertRaises(ValueError, islice, xrange(10), 'a')
339 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
340 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
341 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
342 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000343 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000344
345 def test_takewhile(self):
346 data = [1, 3, 5, 20, 2, 4, 6, 8]
347 underten = lambda x: x<10
348 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000349 self.assertEqual(list(takewhile(underten, [])), [])
350 self.assertRaises(TypeError, takewhile)
351 self.assertRaises(TypeError, takewhile, operator.pow)
352 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
353 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
354 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000355 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
356 self.assertEqual(list(t), [1, 1, 1])
357 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000358
359 def test_dropwhile(self):
360 data = [1, 3, 5, 20, 2, 4, 6, 8]
361 underten = lambda x: x<10
362 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000363 self.assertEqual(list(dropwhile(underten, [])), [])
364 self.assertRaises(TypeError, dropwhile)
365 self.assertRaises(TypeError, dropwhile, operator.pow)
366 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
367 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
368 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000369
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000370 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000371 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000372 def irange(n):
373 for i in xrange(n):
374 yield i
375
376 a, b = tee([]) # test empty iterator
377 self.assertEqual(list(a), [])
378 self.assertEqual(list(b), [])
379
380 a, b = tee(irange(n)) # test 100% interleaved
381 self.assertEqual(zip(a,b), zip(range(n),range(n)))
382
383 a, b = tee(irange(n)) # test 0% interleaved
384 self.assertEqual(list(a), range(n))
385 self.assertEqual(list(b), range(n))
386
387 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000388 for i in xrange(100):
389 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000390 del a
391 self.assertEqual(list(b), range(n))
392
393 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000394 for i in xrange(100):
395 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000396 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000397 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000398
399 for j in xrange(5): # test randomly interleaved
400 order = [0]*n + [1]*n
401 random.shuffle(order)
402 lists = ([], [])
403 its = tee(irange(n))
404 for i in order:
405 value = its[i].next()
406 lists[i].append(value)
407 self.assertEqual(lists[0], range(n))
408 self.assertEqual(lists[1], range(n))
409
Raymond Hettingerad983e72003-11-12 14:32:26 +0000410 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000411 self.assertRaises(TypeError, tee)
412 self.assertRaises(TypeError, tee, 3)
413 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000414 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000415
Raymond Hettingerad983e72003-11-12 14:32:26 +0000416 # tee object should be instantiable
417 a, b = tee('abc')
418 c = type(a)('def')
419 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000420
Raymond Hettingerad983e72003-11-12 14:32:26 +0000421 # test long-lagged and multi-way split
422 a, b, c = tee(xrange(2000), 3)
423 for i in xrange(100):
424 self.assertEqual(a.next(), i)
425 self.assertEqual(list(b), range(2000))
426 self.assertEqual([c.next(), c.next()], range(2))
427 self.assertEqual(list(a), range(100,2000))
428 self.assertEqual(list(c), range(2,2000))
429
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000430 # test values of n
431 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000432 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000433 for n in xrange(5):
434 result = tee('abc', n)
435 self.assertEqual(type(result), tuple)
436 self.assertEqual(len(result), n)
437 self.assertEqual(map(list, result), [list('abc')]*n)
438
Raymond Hettingerad983e72003-11-12 14:32:26 +0000439 # tee pass-through to copyable iterator
440 a, b = tee('abc')
441 c, d = tee(a)
442 self.assert_(a is c)
443
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000444 # test tee_new
445 t1, t2 = tee('abc')
446 tnew = type(t1)
447 self.assertRaises(TypeError, tnew)
448 self.assertRaises(TypeError, tnew, 10)
449 t3 = tnew(t1)
450 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000451
Raymond Hettingera9f60922004-10-17 16:40:14 +0000452 # test that tee objects are weak referencable
453 a, b = tee(xrange(10))
454 p = proxy(a)
455 self.assertEqual(getattr(p, '__class__'), type(b))
456 del a
457 self.assertRaises(ReferenceError, getattr, p, '__class__')
458
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000459 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000460 self.assertRaises(StopIteration, izip().next)
461
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000462 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000463 self.assertRaises(StopIteration, f([]).next)
464 self.assertRaises(StopIteration, f(StopNow()).next)
465
466 self.assertRaises(StopIteration, islice([], None).next)
467 self.assertRaises(StopIteration, islice(StopNow(), None).next)
468
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000469 p, q = tee([])
470 self.assertRaises(StopIteration, p.next)
471 self.assertRaises(StopIteration, q.next)
472 p, q = tee(StopNow())
473 self.assertRaises(StopIteration, p.next)
474 self.assertRaises(StopIteration, q.next)
475
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000476 self.assertRaises(StopIteration, repeat(None, 0).next)
477
478 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
479 self.assertRaises(StopIteration, f(lambda x:x, []).next)
480 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
481
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000482class TestGC(unittest.TestCase):
483
484 def makecycle(self, iterator, container):
485 container.append(iterator)
486 iterator.next()
487 del container, iterator
488
489 def test_chain(self):
490 a = []
491 self.makecycle(chain(a), a)
492
493 def test_cycle(self):
494 a = []
495 self.makecycle(cycle([a]*2), a)
496
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000497 def test_dropwhile(self):
498 a = []
499 self.makecycle(dropwhile(bool, [0, a, a]), a)
500
501 def test_groupby(self):
502 a = []
503 self.makecycle(groupby([a]*2, lambda x:x), a)
504
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000505 def test_ifilter(self):
506 a = []
507 self.makecycle(ifilter(lambda x:True, [a]*2), a)
508
509 def test_ifilterfalse(self):
510 a = []
511 self.makecycle(ifilterfalse(lambda x:False, a), a)
512
513 def test_izip(self):
514 a = []
515 self.makecycle(izip([a]*2, [a]*3), a)
516
517 def test_imap(self):
518 a = []
519 self.makecycle(imap(lambda x:x, [a]*2), a)
520
521 def test_islice(self):
522 a = []
523 self.makecycle(islice([a]*2, None), a)
524
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000525 def test_repeat(self):
526 a = []
527 self.makecycle(repeat(a), a)
528
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000529 def test_starmap(self):
530 a = []
531 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
532
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000533 def test_takewhile(self):
534 a = []
535 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
536
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000537def R(seqn):
538 'Regular generator'
539 for i in seqn:
540 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000541
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000542class G:
543 'Sequence using __getitem__'
544 def __init__(self, seqn):
545 self.seqn = seqn
546 def __getitem__(self, i):
547 return self.seqn[i]
548
549class I:
550 'Sequence using iterator protocol'
551 def __init__(self, seqn):
552 self.seqn = seqn
553 self.i = 0
554 def __iter__(self):
555 return self
556 def next(self):
557 if self.i >= len(self.seqn): raise StopIteration
558 v = self.seqn[self.i]
559 self.i += 1
560 return v
561
562class Ig:
563 'Sequence using iterator protocol defined with a generator'
564 def __init__(self, seqn):
565 self.seqn = seqn
566 self.i = 0
567 def __iter__(self):
568 for val in self.seqn:
569 yield val
570
571class X:
572 'Missing __getitem__ and __iter__'
573 def __init__(self, seqn):
574 self.seqn = seqn
575 self.i = 0
576 def next(self):
577 if self.i >= len(self.seqn): raise StopIteration
578 v = self.seqn[self.i]
579 self.i += 1
580 return v
581
582class N:
583 'Iterator missing next()'
584 def __init__(self, seqn):
585 self.seqn = seqn
586 self.i = 0
587 def __iter__(self):
588 return self
589
590class E:
591 'Test propagation of exceptions'
592 def __init__(self, seqn):
593 self.seqn = seqn
594 self.i = 0
595 def __iter__(self):
596 return self
597 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000598 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000599
600class S:
601 'Test immediate stop'
602 def __init__(self, seqn):
603 pass
604 def __iter__(self):
605 return self
606 def next(self):
607 raise StopIteration
608
609def L(seqn):
610 'Test multiple tiers of iterators'
611 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
612
613
614class TestVariousIteratorArgs(unittest.TestCase):
615
616 def test_chain(self):
617 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
618 for g in (G, I, Ig, S, L, R):
619 self.assertEqual(list(chain(g(s))), list(g(s)))
620 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
621 self.assertRaises(TypeError, chain, X(s))
622 self.assertRaises(TypeError, list, chain(N(s)))
623 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
624
625 def test_cycle(self):
626 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
627 for g in (G, I, Ig, S, L, R):
628 tgtlen = len(s) * 3
629 expected = list(g(s))*3
630 actual = list(islice(cycle(g(s)), tgtlen))
631 self.assertEqual(actual, expected)
632 self.assertRaises(TypeError, cycle, X(s))
633 self.assertRaises(TypeError, list, cycle(N(s)))
634 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
635
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000636 def test_groupby(self):
637 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
638 for g in (G, I, Ig, S, L, R):
639 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
640 self.assertRaises(TypeError, groupby, X(s))
641 self.assertRaises(TypeError, list, groupby(N(s)))
642 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
643
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000644 def test_ifilter(self):
645 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
646 for g in (G, I, Ig, S, L, R):
647 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
648 self.assertRaises(TypeError, ifilter, isEven, X(s))
649 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
650 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
651
652 def test_ifilterfalse(self):
653 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
654 for g in (G, I, Ig, S, L, R):
655 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
656 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
657 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
658 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
659
660 def test_izip(self):
661 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
662 for g in (G, I, Ig, S, L, R):
663 self.assertEqual(list(izip(g(s))), zip(g(s)))
664 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
665 self.assertRaises(TypeError, izip, X(s))
666 self.assertRaises(TypeError, list, izip(N(s)))
667 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
668
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000669 def test_iziplongest(self):
670 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
671 for g in (G, I, Ig, S, L, R):
672 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
673 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
674 self.assertRaises(TypeError, izip_longest, X(s))
675 self.assertRaises(TypeError, list, izip_longest(N(s)))
676 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
677
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000678 def test_imap(self):
679 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
680 for g in (G, I, Ig, S, L, R):
681 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
682 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
683 self.assertRaises(TypeError, imap, onearg, X(s))
684 self.assertRaises(TypeError, list, imap(onearg, N(s)))
685 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
686
687 def test_islice(self):
688 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
689 for g in (G, I, Ig, S, L, R):
690 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
691 self.assertRaises(TypeError, islice, X(s), 10)
692 self.assertRaises(TypeError, list, islice(N(s), 10))
693 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
694
695 def test_starmap(self):
696 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
697 for g in (G, I, Ig, S, L, R):
698 ss = zip(s, s)
699 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
700 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
701 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
702 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
703
704 def test_takewhile(self):
705 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
706 for g in (G, I, Ig, S, L, R):
707 tgt = []
708 for elem in g(s):
709 if not isEven(elem): break
710 tgt.append(elem)
711 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
712 self.assertRaises(TypeError, takewhile, isEven, X(s))
713 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
714 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
715
716 def test_dropwhile(self):
717 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
718 for g in (G, I, Ig, S, L, R):
719 tgt = []
720 for elem in g(s):
721 if not tgt and isOdd(elem): continue
722 tgt.append(elem)
723 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
724 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
725 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
726 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
727
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000728 def test_tee(self):
729 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
730 for g in (G, I, Ig, S, L, R):
731 it1, it2 = tee(g(s))
732 self.assertEqual(list(it1), list(g(s)))
733 self.assertEqual(list(it2), list(g(s)))
734 self.assertRaises(TypeError, tee, X(s))
735 self.assertRaises(TypeError, list, tee(N(s))[0])
736 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
737
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000738class LengthTransparency(unittest.TestCase):
739
740 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000741 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000742 self.assertEqual(len(repeat(None, 50)), 50)
743 self.assertRaises(TypeError, len, repeat(None))
744
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000745class RegressionTests(unittest.TestCase):
746
747 def test_sf_793826(self):
748 # Fix Armin Rigo's successful efforts to wreak havoc
749
750 def mutatingtuple(tuple1, f, tuple2):
751 # this builds a tuple t which is a copy of tuple1,
752 # then calls f(t), then mutates t to be equal to tuple2
753 # (needs len(tuple1) == len(tuple2)).
754 def g(value, first=[1]):
755 if first:
756 del first[:]
757 f(z.next())
758 return value
759 items = list(tuple2)
760 items[1:1] = list(tuple1)
761 gen = imap(g, items)
762 z = izip(*[gen]*len(tuple1))
763 z.next()
764
765 def f(t):
766 global T
767 T = t
768 first[:] = list(T)
769
770 first = []
771 mutatingtuple((1,2,3), f, (4,5,6))
772 second = list(T)
773 self.assertEqual(first, second)
774
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000775
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000776 def test_sf_950057(self):
777 # Make sure that chain() and cycle() catch exceptions immediately
778 # rather than when shifting between input sources
779
780 def gen1():
781 hist.append(0)
782 yield 1
783 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000784 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000785 hist.append(2)
786
787 def gen2(x):
788 hist.append(3)
789 yield 2
790 hist.append(4)
791 if x:
792 raise StopIteration
793
794 hist = []
795 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
796 self.assertEqual(hist, [0,1])
797
798 hist = []
799 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
800 self.assertEqual(hist, [0,1])
801
802 hist = []
803 self.assertRaises(AssertionError, list, cycle(gen1()))
804 self.assertEqual(hist, [0,1])
805
Georg Brandlb84c1372007-01-21 10:28:43 +0000806class SubclassWithKwargsTest(unittest.TestCase):
807 def test_keywords_in_subclass(self):
808 # count is not subclassable...
809 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
810 starmap, islice, takewhile, dropwhile, cycle):
811 class Subclass(cls):
812 def __init__(self, newarg=None, *args):
813 cls.__init__(self, *args)
814 try:
815 Subclass(newarg=1)
816 except TypeError, err:
817 # we expect type errors because of wrong argument count
818 self.failIf("does not take keyword arguments" in err.args[0])
819
820
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000821libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000822
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000823
824>>> amounts = [120.15, 764.05, 823.14]
825>>> for checknum, amount in izip(count(1200), amounts):
826... print 'Check %d is for $%.2f' % (checknum, amount)
827...
828Check 1200 is for $120.15
829Check 1201 is for $764.05
830Check 1202 is for $823.14
831
832>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000833>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
834... print cube
835...
8361
8378
83827
839
840>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000841>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000842... print name.title()
843...
844Alex
845Laura
846Martin
847Walter
848Samuele
849
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000850>>> from operator import itemgetter
851>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000852>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000853>>> for k, g in groupby(di, itemgetter(1)):
854... print k, map(itemgetter(0), g)
855...
8561 ['a', 'c', 'e']
8572 ['b', 'd', 'f']
8583 ['g']
859
Raymond Hettinger734fb572004-01-20 20:04:40 +0000860# Find runs of consecutive numbers using groupby. The key to the solution
861# is differencing with a range so that consecutive numbers all appear in
862# same group.
863>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
864>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
865... print map(operator.itemgetter(1), g)
866...
867[1]
868[4, 5, 6]
869[10]
870[15, 16, 17, 18]
871[22]
872[25, 26, 27, 28]
873
Raymond Hettingera098b332003-09-08 23:58:40 +0000874>>> def take(n, seq):
875... return list(islice(seq, n))
876
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000877>>> def enumerate(iterable):
878... return izip(count(), iterable)
879
880>>> def tabulate(function):
881... "Return function(0), function(1), ..."
882... return imap(function, count())
883
884>>> def iteritems(mapping):
885... return izip(mapping.iterkeys(), mapping.itervalues())
886
887>>> def nth(iterable, n):
888... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000889... return list(islice(iterable, n, n+1))
890
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000891>>> def all(seq, pred=None):
892... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000893... for elem in ifilterfalse(pred, seq):
894... return False
895... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000896
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000897>>> def any(seq, pred=None):
898... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000899... for elem in ifilter(pred, seq):
900... return True
901... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000902
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000903>>> def no(seq, pred=None):
904... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000905... for elem in ifilter(pred, seq):
906... return False
907... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000908
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000909>>> def quantify(seq, pred=None):
910... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000911... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000912
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000913>>> def padnone(seq):
914... "Returns the sequence elements and then returns None indefinitely"
915... return chain(seq, repeat(None))
916
917>>> def ncycles(seq, n):
918... "Returns the sequence elements n times"
919... return chain(*repeat(seq, n))
920
921>>> def dotproduct(vec1, vec2):
922... return sum(imap(operator.mul, vec1, vec2))
923
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000924>>> def flatten(listOfLists):
925... return list(chain(*listOfLists))
926
927>>> def repeatfunc(func, times=None, *args):
928... "Repeat calls to func with specified arguments."
929... " Example: repeatfunc(random.random)"
930... if times is None:
931... return starmap(func, repeat(args))
932... else:
933... return starmap(func, repeat(args, times))
934
Raymond Hettingerd591f662003-10-26 15:34:50 +0000935>>> def pairwise(iterable):
936... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
937... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000938... try:
939... b.next()
940... except StopIteration:
941... pass
942... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000943
944This is not part of the examples but it tests to make sure the definitions
945perform as purported.
946
Raymond Hettingera098b332003-09-08 23:58:40 +0000947>>> take(10, count())
948[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
949
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000950>>> list(enumerate('abc'))
951[(0, 'a'), (1, 'b'), (2, 'c')]
952
953>>> list(islice(tabulate(lambda x: 2*x), 4))
954[0, 2, 4, 6]
955
956>>> nth('abcde', 3)
957['d']
958
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000959>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000960True
961
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000962>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000963False
964
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000965>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000966True
967
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000968>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000969False
970
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000971>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000972True
973
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000974>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000975False
976
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000977>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000097850
979
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000980>>> a = [[1, 2, 3], [4, 5, 6]]
981>>> flatten(a)
982[1, 2, 3, 4, 5, 6]
983
984>>> list(repeatfunc(pow, 5, 2, 3))
985[8, 8, 8, 8, 8]
986
987>>> import random
988>>> take(5, imap(int, repeatfunc(random.random)))
989[0, 0, 0, 0, 0]
990
Raymond Hettingerd591f662003-10-26 15:34:50 +0000991>>> list(pairwise('abcd'))
992[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000993
Raymond Hettingerd591f662003-10-26 15:34:50 +0000994>>> list(pairwise([]))
995[]
996
997>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000998[]
999
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001000>>> list(islice(padnone('abc'), 0, 6))
1001['a', 'b', 'c', None, None, None]
1002
1003>>> list(ncycles('abc', 3))
1004['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1005
1006>>> dotproduct([1,2,3], [4,5,6])
100732
1008
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001009"""
1010
1011__test__ = {'libreftest' : libreftest}
1012
1013def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001014 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001015 RegressionTests, LengthTransparency,
1016 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001017 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001018
1019 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001020 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001021 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001022 counts = [None] * 5
1023 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001024 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001025 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001026 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001027 print counts
1028
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001029 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001030 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001031
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001032if __name__ == "__main__":
1033 test_main(verbose=True)