blob: 9d1922823d30744bb49932491cc4a45a9ce30ee1 [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 Hettinger47317092008-01-17 03:02:14 +0000295 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
296 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000297 self.assertRaises(TypeError, starmap)
298 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
299 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
300 self.assertRaises(ValueError, starmap(errfunc, [(4,5)]).next)
301 self.assertRaises(TypeError, starmap(onearg, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000302
303 def test_islice(self):
304 for args in [ # islice(args) should agree with range(args)
305 (10, 20, 3),
306 (10, 3, 20),
307 (10, 20),
308 (10, 3),
309 (20,)
310 ]:
311 self.assertEqual(list(islice(xrange(100), *args)), range(*args))
312
313 for args, tgtargs in [ # Stop when seqn is exhausted
314 ((10, 110, 3), ((10, 100, 3))),
315 ((10, 110), ((10, 100))),
316 ((110,), (100,))
317 ]:
318 self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
319
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000320 # Test stop=None
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000321 self.assertEqual(list(islice(xrange(10), None)), range(10))
Raymond Hettingerb2594052004-12-05 09:25:51 +0000322 self.assertEqual(list(islice(xrange(10), None, None)), range(10))
323 self.assertEqual(list(islice(xrange(10), None, None, None)), range(10))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000324 self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
325 self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
326
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +0000327 # Test number of items consumed SF #1171417
328 it = iter(range(10))
329 self.assertEqual(list(islice(it, 3)), range(3))
330 self.assertEqual(list(it), range(3, 10))
331
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000332 # Test invalid arguments
Raymond Hettinger341deb72003-05-02 19:44:20 +0000333 self.assertRaises(TypeError, islice, xrange(10))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000334 self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
335 self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
336 self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)
337 self.assertRaises(ValueError, islice, xrange(10), 1, 10, -1)
338 self.assertRaises(ValueError, islice, xrange(10), 1, 10, 0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000339 self.assertRaises(ValueError, islice, xrange(10), 'a')
340 self.assertRaises(ValueError, islice, xrange(10), 'a', 1)
341 self.assertRaises(ValueError, islice, xrange(10), 1, 'a')
342 self.assertRaises(ValueError, islice, xrange(10), 'a', 1, 1)
343 self.assertRaises(ValueError, islice, xrange(10), 1, 'a', 1)
Kristján Valur Jónsson170eee92007-05-03 20:09:56 +0000344 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000345
346 def test_takewhile(self):
347 data = [1, 3, 5, 20, 2, 4, 6, 8]
348 underten = lambda x: x<10
349 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000350 self.assertEqual(list(takewhile(underten, [])), [])
351 self.assertRaises(TypeError, takewhile)
352 self.assertRaises(TypeError, takewhile, operator.pow)
353 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
354 self.assertRaises(TypeError, takewhile(10, [(4,5)]).next)
355 self.assertRaises(ValueError, takewhile(errfunc, [(4,5)]).next)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000356 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
357 self.assertEqual(list(t), [1, 1, 1])
358 self.assertRaises(StopIteration, t.next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000359
360 def test_dropwhile(self):
361 data = [1, 3, 5, 20, 2, 4, 6, 8]
362 underten = lambda x: x<10
363 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000364 self.assertEqual(list(dropwhile(underten, [])), [])
365 self.assertRaises(TypeError, dropwhile)
366 self.assertRaises(TypeError, dropwhile, operator.pow)
367 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
368 self.assertRaises(TypeError, dropwhile(10, [(4,5)]).next)
369 self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000370
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000371 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +0000372 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000373 def irange(n):
374 for i in xrange(n):
375 yield i
376
377 a, b = tee([]) # test empty iterator
378 self.assertEqual(list(a), [])
379 self.assertEqual(list(b), [])
380
381 a, b = tee(irange(n)) # test 100% interleaved
382 self.assertEqual(zip(a,b), zip(range(n),range(n)))
383
384 a, b = tee(irange(n)) # test 0% interleaved
385 self.assertEqual(list(a), range(n))
386 self.assertEqual(list(b), range(n))
387
388 a, b = tee(irange(n)) # test dealloc of leading iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000389 for i in xrange(100):
390 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000391 del a
392 self.assertEqual(list(b), range(n))
393
394 a, b = tee(irange(n)) # test dealloc of trailing iterator
Raymond Hettingerad983e72003-11-12 14:32:26 +0000395 for i in xrange(100):
396 self.assertEqual(a.next(), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000397 del b
Raymond Hettingerad983e72003-11-12 14:32:26 +0000398 self.assertEqual(list(a), range(100, n))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000399
400 for j in xrange(5): # test randomly interleaved
401 order = [0]*n + [1]*n
402 random.shuffle(order)
403 lists = ([], [])
404 its = tee(irange(n))
405 for i in order:
406 value = its[i].next()
407 lists[i].append(value)
408 self.assertEqual(lists[0], range(n))
409 self.assertEqual(lists[1], range(n))
410
Raymond Hettingerad983e72003-11-12 14:32:26 +0000411 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000412 self.assertRaises(TypeError, tee)
413 self.assertRaises(TypeError, tee, 3)
414 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +0000415 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000416
Raymond Hettingerad983e72003-11-12 14:32:26 +0000417 # tee object should be instantiable
418 a, b = tee('abc')
419 c = type(a)('def')
420 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000421
Raymond Hettingerad983e72003-11-12 14:32:26 +0000422 # test long-lagged and multi-way split
423 a, b, c = tee(xrange(2000), 3)
424 for i in xrange(100):
425 self.assertEqual(a.next(), i)
426 self.assertEqual(list(b), range(2000))
427 self.assertEqual([c.next(), c.next()], range(2))
428 self.assertEqual(list(a), range(100,2000))
429 self.assertEqual(list(c), range(2,2000))
430
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000431 # test values of n
432 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Neal Norwitz69e88972006-09-02 02:58:13 +0000433 self.assertRaises(ValueError, tee, [], -1)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000434 for n in xrange(5):
435 result = tee('abc', n)
436 self.assertEqual(type(result), tuple)
437 self.assertEqual(len(result), n)
438 self.assertEqual(map(list, result), [list('abc')]*n)
439
Raymond Hettingerad983e72003-11-12 14:32:26 +0000440 # tee pass-through to copyable iterator
441 a, b = tee('abc')
442 c, d = tee(a)
443 self.assert_(a is c)
444
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000445 # test tee_new
446 t1, t2 = tee('abc')
447 tnew = type(t1)
448 self.assertRaises(TypeError, tnew)
449 self.assertRaises(TypeError, tnew, 10)
450 t3 = tnew(t1)
451 self.assert_(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +0000452
Raymond Hettingera9f60922004-10-17 16:40:14 +0000453 # test that tee objects are weak referencable
454 a, b = tee(xrange(10))
455 p = proxy(a)
456 self.assertEqual(getattr(p, '__class__'), type(b))
457 del a
458 self.assertRaises(ReferenceError, getattr, p, '__class__')
459
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000460 def test_StopIteration(self):
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000461 self.assertRaises(StopIteration, izip().next)
462
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000463 for f in (chain, cycle, izip, groupby):
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000464 self.assertRaises(StopIteration, f([]).next)
465 self.assertRaises(StopIteration, f(StopNow()).next)
466
467 self.assertRaises(StopIteration, islice([], None).next)
468 self.assertRaises(StopIteration, islice(StopNow(), None).next)
469
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000470 p, q = tee([])
471 self.assertRaises(StopIteration, p.next)
472 self.assertRaises(StopIteration, q.next)
473 p, q = tee(StopNow())
474 self.assertRaises(StopIteration, p.next)
475 self.assertRaises(StopIteration, q.next)
476
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000477 self.assertRaises(StopIteration, repeat(None, 0).next)
478
479 for f in (ifilter, ifilterfalse, imap, takewhile, dropwhile, starmap):
480 self.assertRaises(StopIteration, f(lambda x:x, []).next)
481 self.assertRaises(StopIteration, f(lambda x:x, StopNow()).next)
482
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000483class TestGC(unittest.TestCase):
484
485 def makecycle(self, iterator, container):
486 container.append(iterator)
487 iterator.next()
488 del container, iterator
489
490 def test_chain(self):
491 a = []
492 self.makecycle(chain(a), a)
493
494 def test_cycle(self):
495 a = []
496 self.makecycle(cycle([a]*2), a)
497
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000498 def test_dropwhile(self):
499 a = []
500 self.makecycle(dropwhile(bool, [0, a, a]), a)
501
502 def test_groupby(self):
503 a = []
504 self.makecycle(groupby([a]*2, lambda x:x), a)
505
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000506 def test_ifilter(self):
507 a = []
508 self.makecycle(ifilter(lambda x:True, [a]*2), a)
509
510 def test_ifilterfalse(self):
511 a = []
512 self.makecycle(ifilterfalse(lambda x:False, a), a)
513
514 def test_izip(self):
515 a = []
516 self.makecycle(izip([a]*2, [a]*3), a)
517
518 def test_imap(self):
519 a = []
520 self.makecycle(imap(lambda x:x, [a]*2), a)
521
522 def test_islice(self):
523 a = []
524 self.makecycle(islice([a]*2, None), a)
525
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000526 def test_repeat(self):
527 a = []
528 self.makecycle(repeat(a), a)
529
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000530 def test_starmap(self):
531 a = []
532 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
533
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +0000534 def test_takewhile(self):
535 a = []
536 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
537
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000538def R(seqn):
539 'Regular generator'
540 for i in seqn:
541 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +0000542
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000543class G:
544 'Sequence using __getitem__'
545 def __init__(self, seqn):
546 self.seqn = seqn
547 def __getitem__(self, i):
548 return self.seqn[i]
549
550class I:
551 'Sequence using iterator protocol'
552 def __init__(self, seqn):
553 self.seqn = seqn
554 self.i = 0
555 def __iter__(self):
556 return self
557 def next(self):
558 if self.i >= len(self.seqn): raise StopIteration
559 v = self.seqn[self.i]
560 self.i += 1
561 return v
562
563class Ig:
564 'Sequence using iterator protocol defined with a generator'
565 def __init__(self, seqn):
566 self.seqn = seqn
567 self.i = 0
568 def __iter__(self):
569 for val in self.seqn:
570 yield val
571
572class X:
573 'Missing __getitem__ and __iter__'
574 def __init__(self, seqn):
575 self.seqn = seqn
576 self.i = 0
577 def next(self):
578 if self.i >= len(self.seqn): raise StopIteration
579 v = self.seqn[self.i]
580 self.i += 1
581 return v
582
583class N:
584 'Iterator missing next()'
585 def __init__(self, seqn):
586 self.seqn = seqn
587 self.i = 0
588 def __iter__(self):
589 return self
590
591class E:
592 'Test propagation of exceptions'
593 def __init__(self, seqn):
594 self.seqn = seqn
595 self.i = 0
596 def __iter__(self):
597 return self
598 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000599 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000600
601class S:
602 'Test immediate stop'
603 def __init__(self, seqn):
604 pass
605 def __iter__(self):
606 return self
607 def next(self):
608 raise StopIteration
609
610def L(seqn):
611 'Test multiple tiers of iterators'
612 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
613
614
615class TestVariousIteratorArgs(unittest.TestCase):
616
617 def test_chain(self):
618 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
619 for g in (G, I, Ig, S, L, R):
620 self.assertEqual(list(chain(g(s))), list(g(s)))
621 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
622 self.assertRaises(TypeError, chain, X(s))
623 self.assertRaises(TypeError, list, chain(N(s)))
624 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
625
626 def test_cycle(self):
627 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
628 for g in (G, I, Ig, S, L, R):
629 tgtlen = len(s) * 3
630 expected = list(g(s))*3
631 actual = list(islice(cycle(g(s)), tgtlen))
632 self.assertEqual(actual, expected)
633 self.assertRaises(TypeError, cycle, X(s))
634 self.assertRaises(TypeError, list, cycle(N(s)))
635 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
636
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000637 def test_groupby(self):
638 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
639 for g in (G, I, Ig, S, L, R):
640 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
641 self.assertRaises(TypeError, groupby, X(s))
642 self.assertRaises(TypeError, list, groupby(N(s)))
643 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
644
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000645 def test_ifilter(self):
646 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
647 for g in (G, I, Ig, S, L, R):
648 self.assertEqual(list(ifilter(isEven, g(s))), filter(isEven, g(s)))
649 self.assertRaises(TypeError, ifilter, isEven, X(s))
650 self.assertRaises(TypeError, list, ifilter(isEven, N(s)))
651 self.assertRaises(ZeroDivisionError, list, ifilter(isEven, E(s)))
652
653 def test_ifilterfalse(self):
654 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
655 for g in (G, I, Ig, S, L, R):
656 self.assertEqual(list(ifilterfalse(isEven, g(s))), filter(isOdd, g(s)))
657 self.assertRaises(TypeError, ifilterfalse, isEven, X(s))
658 self.assertRaises(TypeError, list, ifilterfalse(isEven, N(s)))
659 self.assertRaises(ZeroDivisionError, list, ifilterfalse(isEven, E(s)))
660
661 def test_izip(self):
662 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
663 for g in (G, I, Ig, S, L, R):
664 self.assertEqual(list(izip(g(s))), zip(g(s)))
665 self.assertEqual(list(izip(g(s), g(s))), zip(g(s), g(s)))
666 self.assertRaises(TypeError, izip, X(s))
667 self.assertRaises(TypeError, list, izip(N(s)))
668 self.assertRaises(ZeroDivisionError, list, izip(E(s)))
669
Raymond Hettingerd36862c2007-02-21 05:20:38 +0000670 def test_iziplongest(self):
671 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
672 for g in (G, I, Ig, S, L, R):
673 self.assertEqual(list(izip_longest(g(s))), zip(g(s)))
674 self.assertEqual(list(izip_longest(g(s), g(s))), zip(g(s), g(s)))
675 self.assertRaises(TypeError, izip_longest, X(s))
676 self.assertRaises(TypeError, list, izip_longest(N(s)))
677 self.assertRaises(ZeroDivisionError, list, izip_longest(E(s)))
678
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000679 def test_imap(self):
680 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
681 for g in (G, I, Ig, S, L, R):
682 self.assertEqual(list(imap(onearg, g(s))), map(onearg, g(s)))
683 self.assertEqual(list(imap(operator.pow, g(s), g(s))), map(operator.pow, g(s), g(s)))
684 self.assertRaises(TypeError, imap, onearg, X(s))
685 self.assertRaises(TypeError, list, imap(onearg, N(s)))
686 self.assertRaises(ZeroDivisionError, list, imap(onearg, E(s)))
687
688 def test_islice(self):
689 for s in ("12345", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
690 for g in (G, I, Ig, S, L, R):
691 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
692 self.assertRaises(TypeError, islice, X(s), 10)
693 self.assertRaises(TypeError, list, islice(N(s), 10))
694 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
695
696 def test_starmap(self):
697 for s in (range(10), range(0), range(100), (7,11), xrange(20,50,5)):
698 for g in (G, I, Ig, S, L, R):
699 ss = zip(s, s)
700 self.assertEqual(list(starmap(operator.pow, g(ss))), map(operator.pow, g(s), g(s)))
701 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
702 self.assertRaises(TypeError, list, starmap(operator.pow, N(ss)))
703 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
704
705 def test_takewhile(self):
706 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
707 for g in (G, I, Ig, S, L, R):
708 tgt = []
709 for elem in g(s):
710 if not isEven(elem): break
711 tgt.append(elem)
712 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
713 self.assertRaises(TypeError, takewhile, isEven, X(s))
714 self.assertRaises(TypeError, list, takewhile(isEven, N(s)))
715 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
716
717 def test_dropwhile(self):
718 for s in (range(10), range(0), range(1000), (7,11), xrange(2000,2200,5)):
719 for g in (G, I, Ig, S, L, R):
720 tgt = []
721 for elem in g(s):
722 if not tgt and isOdd(elem): continue
723 tgt.append(elem)
724 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
725 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
726 self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
727 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
728
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000729 def test_tee(self):
730 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
731 for g in (G, I, Ig, S, L, R):
732 it1, it2 = tee(g(s))
733 self.assertEqual(list(it1), list(g(s)))
734 self.assertEqual(list(it2), list(g(s)))
735 self.assertRaises(TypeError, tee, X(s))
736 self.assertRaises(TypeError, list, tee(N(s))[0])
737 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
738
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000739class LengthTransparency(unittest.TestCase):
740
741 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000742 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +0000743 self.assertEqual(len(repeat(None, 50)), 50)
744 self.assertRaises(TypeError, len, repeat(None))
745
Raymond Hettingera56f6b62003-08-29 23:09:58 +0000746class RegressionTests(unittest.TestCase):
747
748 def test_sf_793826(self):
749 # Fix Armin Rigo's successful efforts to wreak havoc
750
751 def mutatingtuple(tuple1, f, tuple2):
752 # this builds a tuple t which is a copy of tuple1,
753 # then calls f(t), then mutates t to be equal to tuple2
754 # (needs len(tuple1) == len(tuple2)).
755 def g(value, first=[1]):
756 if first:
757 del first[:]
758 f(z.next())
759 return value
760 items = list(tuple2)
761 items[1:1] = list(tuple1)
762 gen = imap(g, items)
763 z = izip(*[gen]*len(tuple1))
764 z.next()
765
766 def f(t):
767 global T
768 T = t
769 first[:] = list(T)
770
771 first = []
772 mutatingtuple((1,2,3), f, (4,5,6))
773 second = list(T)
774 self.assertEqual(first, second)
775
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000776
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000777 def test_sf_950057(self):
778 # Make sure that chain() and cycle() catch exceptions immediately
779 # rather than when shifting between input sources
780
781 def gen1():
782 hist.append(0)
783 yield 1
784 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +0000785 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +0000786 hist.append(2)
787
788 def gen2(x):
789 hist.append(3)
790 yield 2
791 hist.append(4)
792 if x:
793 raise StopIteration
794
795 hist = []
796 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
797 self.assertEqual(hist, [0,1])
798
799 hist = []
800 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
801 self.assertEqual(hist, [0,1])
802
803 hist = []
804 self.assertRaises(AssertionError, list, cycle(gen1()))
805 self.assertEqual(hist, [0,1])
806
Georg Brandlb84c1372007-01-21 10:28:43 +0000807class SubclassWithKwargsTest(unittest.TestCase):
808 def test_keywords_in_subclass(self):
809 # count is not subclassable...
810 for cls in (repeat, izip, ifilter, ifilterfalse, chain, imap,
811 starmap, islice, takewhile, dropwhile, cycle):
812 class Subclass(cls):
813 def __init__(self, newarg=None, *args):
814 cls.__init__(self, *args)
815 try:
816 Subclass(newarg=1)
817 except TypeError, err:
818 # we expect type errors because of wrong argument count
819 self.failIf("does not take keyword arguments" in err.args[0])
820
821
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000822libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000823
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000824
825>>> amounts = [120.15, 764.05, 823.14]
826>>> for checknum, amount in izip(count(1200), amounts):
827... print 'Check %d is for $%.2f' % (checknum, amount)
828...
829Check 1200 is for $120.15
830Check 1201 is for $764.05
831Check 1202 is for $823.14
832
833>>> import operator
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000834>>> for cube in imap(operator.pow, xrange(1,4), repeat(3)):
835... print cube
836...
8371
8388
83927
840
841>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +0000842>>> for name in islice(reportlines, 3, None, 2):
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000843... print name.title()
844...
845Alex
846Laura
847Martin
848Walter
849Samuele
850
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000851>>> from operator import itemgetter
852>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Armin Rigoa3f09272006-05-28 19:13:17 +0000853>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000854>>> for k, g in groupby(di, itemgetter(1)):
855... print k, map(itemgetter(0), g)
856...
8571 ['a', 'c', 'e']
8582 ['b', 'd', 'f']
8593 ['g']
860
Raymond Hettinger734fb572004-01-20 20:04:40 +0000861# Find runs of consecutive numbers using groupby. The key to the solution
862# is differencing with a range so that consecutive numbers all appear in
863# same group.
864>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
865>>> for k, g in groupby(enumerate(data), lambda (i,x):i-x):
866... print map(operator.itemgetter(1), g)
867...
868[1]
869[4, 5, 6]
870[10]
871[15, 16, 17, 18]
872[22]
873[25, 26, 27, 28]
874
Raymond Hettingera098b332003-09-08 23:58:40 +0000875>>> def take(n, seq):
876... return list(islice(seq, n))
877
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000878>>> def enumerate(iterable):
879... return izip(count(), iterable)
880
881>>> def tabulate(function):
882... "Return function(0), function(1), ..."
883... return imap(function, count())
884
885>>> def iteritems(mapping):
886... return izip(mapping.iterkeys(), mapping.itervalues())
887
888>>> def nth(iterable, n):
889... "Returns the nth item"
Raymond Hettinger60eca932003-02-09 06:40:58 +0000890... return list(islice(iterable, n, n+1))
891
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000892>>> def all(seq, pred=None):
893... "Returns True if pred(x) is true for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000894... for elem in ifilterfalse(pred, seq):
895... return False
896... return True
Raymond Hettinger60eca932003-02-09 06:40:58 +0000897
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000898>>> def any(seq, pred=None):
899... "Returns True if pred(x) is true for at least one element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000900... for elem in ifilter(pred, seq):
901... return True
902... return False
Raymond Hettinger60eca932003-02-09 06:40:58 +0000903
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000904>>> def no(seq, pred=None):
905... "Returns True if pred(x) is false for every element in the iterable"
Raymond Hettinger4533f1f2004-09-23 07:27:39 +0000906... for elem in ifilter(pred, seq):
907... return False
908... return True
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000909
Raymond Hettingerf77d0332005-03-11 22:17:30 +0000910>>> def quantify(seq, pred=None):
911... "Count how many times the predicate is true in the sequence"
Raymond Hettinger77fe69b2003-08-08 04:33:19 +0000912... return sum(imap(pred, seq))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000913
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000914>>> def padnone(seq):
915... "Returns the sequence elements and then returns None indefinitely"
916... return chain(seq, repeat(None))
917
918>>> def ncycles(seq, n):
919... "Returns the sequence elements n times"
920... return chain(*repeat(seq, n))
921
922>>> def dotproduct(vec1, vec2):
923... return sum(imap(operator.mul, vec1, vec2))
924
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000925>>> def flatten(listOfLists):
926... return list(chain(*listOfLists))
927
928>>> def repeatfunc(func, times=None, *args):
929... "Repeat calls to func with specified arguments."
930... " Example: repeatfunc(random.random)"
931... if times is None:
932... return starmap(func, repeat(args))
933... else:
934... return starmap(func, repeat(args, times))
935
Raymond Hettingerd591f662003-10-26 15:34:50 +0000936>>> def pairwise(iterable):
937... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
938... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +0000939... try:
940... b.next()
941... except StopIteration:
942... pass
943... return izip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000944
945This is not part of the examples but it tests to make sure the definitions
946perform as purported.
947
Raymond Hettingera098b332003-09-08 23:58:40 +0000948>>> take(10, count())
949[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
950
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000951>>> list(enumerate('abc'))
952[(0, 'a'), (1, 'b'), (2, 'c')]
953
954>>> list(islice(tabulate(lambda x: 2*x), 4))
955[0, 2, 4, 6]
956
957>>> nth('abcde', 3)
958['d']
959
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000960>>> all([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000961True
962
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000963>>> all([2, 3, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000964False
965
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000966>>> any([2, 4, 6, 8], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000967True
968
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000969>>> any([1, 3, 5, 9], lambda x: x%2==0,)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000970False
971
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000972>>> no([1, 3, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000973True
974
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000975>>> no([1, 2, 5, 9], lambda x: x%2==0)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000976False
977
Raymond Hettingerdbe3d282003-10-05 16:47:36 +0000978>>> quantify(xrange(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +000097950
980
Raymond Hettinger6a5b0272003-10-24 08:45:23 +0000981>>> a = [[1, 2, 3], [4, 5, 6]]
982>>> flatten(a)
983[1, 2, 3, 4, 5, 6]
984
985>>> list(repeatfunc(pow, 5, 2, 3))
986[8, 8, 8, 8, 8]
987
988>>> import random
989>>> take(5, imap(int, repeatfunc(random.random)))
990[0, 0, 0, 0, 0]
991
Raymond Hettingerd591f662003-10-26 15:34:50 +0000992>>> list(pairwise('abcd'))
993[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +0000994
Raymond Hettingerd591f662003-10-26 15:34:50 +0000995>>> list(pairwise([]))
996[]
997
998>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +0000999[]
1000
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001001>>> list(islice(padnone('abc'), 0, 6))
1002['a', 'b', 'c', None, None, None]
1003
1004>>> list(ncycles('abc', 3))
1005['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
1006
1007>>> dotproduct([1,2,3], [4,5,6])
100832
1009
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001010"""
1011
1012__test__ = {'libreftest' : libreftest}
1013
1014def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001015 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Georg Brandlb84c1372007-01-21 10:28:43 +00001016 RegressionTests, LengthTransparency,
1017 SubclassWithKwargsTest)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001018 test_support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001019
1020 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001021 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00001022 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001023 counts = [None] * 5
1024 for i in xrange(len(counts)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001025 test_support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00001026 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001027 counts[i] = sys.gettotalrefcount()
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001028 print counts
1029
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001030 # doctest the examples in the library reference
Raymond Hettinger929f06c2003-05-16 23:16:36 +00001031 test_support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001032
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001033if __name__ == "__main__":
1034 test_main(verbose=True)