blob: 355c6907f34e820f69aeb082de26649e86373b1b [file] [log] [blame]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger96ef8112003-02-01 00:10:11 +00003from itertools import *
Raymond Hettingera9f60922004-10-17 16:40:14 +00004from weakref import proxy
Raymond Hettinger8a882a72009-02-12 12:08:18 +00005from decimal import Decimal
Raymond Hettingerde09acf2009-02-12 12:53:53 +00006from fractions import Fraction
Raymond Hettinger2012f172003-02-07 05:32:58 +00007import sys
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00008import operator
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00009import random
Raymond Hettingera3e1ad22009-11-30 22:02:31 +000010import copy
11import pickle
Christian Heimesc3f30c42008-02-22 16:37:40 +000012from functools import reduce
Benjamin Petersonee8712c2008-05-20 21:35:26 +000013maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000014minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000015
Guido van Rossum801f0d72006-08-24 19:48:10 +000016def lzip(*args):
17 return list(zip(*args))
18
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000019def onearg(x):
20 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000021 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000022
23def errfunc(*args):
24 'Test function that raises an error'
25 raise ValueError
26
27def gen3():
28 'Non-restartable source sequence'
29 for i in (0, 1, 2):
30 yield i
31
32def isEven(x):
33 'Test predicate'
34 return x%2==0
35
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000036def isOdd(x):
37 'Test predicate'
38 return x%2==1
39
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000040def tupleize(*args):
41 return args
42
43def irange(n):
44 for i in range(n):
45 yield i
46
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000047class StopNow:
48 'Class emulating an empty iterable.'
49 def __iter__(self):
50 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000051 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000052 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000053
Raymond Hettinger02420702003-06-29 20:36:23 +000054def take(n, seq):
55 'Convenience function for partially consuming a long of infinite iterable'
56 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000057
Christian Heimes78644762008-03-04 23:39:23 +000058def prod(iterable):
59 return reduce(operator.mul, iterable, 1)
60
Christian Heimes380f7f22008-02-28 11:19:05 +000061def fact(n):
62 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000063 return prod(range(1, n+1))
64
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000065# root level methods for pickling ability
66def testR(r):
67 return r[0]
68
69def testR2(r):
70 return r[2]
71
72def underten(x):
73 return x<10
74
Raymond Hettinger96ef8112003-02-01 00:10:11 +000075class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000076
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000077 def pickletest(self, it, stop=4, take=1, compare=None):
78 """Test that an iterator is the same after pickling, also when part-consumed"""
79 def expand(it, i=0):
80 # Recursively expand iterables, within sensible bounds
81 if i > 10:
82 raise RuntimeError("infinite recursion encountered")
83 if isinstance(it, str):
84 return it
85 try:
86 l = list(islice(it, stop))
87 except TypeError:
88 return it # can't expand it
89 return [expand(e, i+1) for e in l]
90
91 # Test the initial copy against the original
92 dump = pickle.dumps(it)
93 i2 = pickle.loads(dump)
94 self.assertEqual(type(it), type(i2))
95 a, b = expand(it), expand(i2)
96 self.assertEqual(a, b)
97 if compare:
98 c = expand(compare)
99 self.assertEqual(a, c)
100
101 # Take from the copy, and create another copy and compare them.
102 i3 = pickle.loads(dump)
103 took = 0
104 try:
105 for i in range(take):
106 next(i3)
107 took += 1
108 except StopIteration:
109 pass #in case there is less data than 'take'
110 dump = pickle.dumps(i3)
111 i4 = pickle.loads(dump)
112 a, b = expand(i3), expand(i4)
113 self.assertEqual(a, b)
114 if compare:
115 c = expand(compare[took:])
116 self.assertEqual(a, c);
117
Raymond Hettinger482ba772010-12-01 22:48:00 +0000118 def test_accumulate(self):
119 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000120 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
121 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
122 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +0000123 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000124 self.assertEqual(
125 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +0000126 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +0000127 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +0000128 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000129 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -0700130 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +0000131 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000132 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +0000133 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
134
Raymond Hettinger5d446132011-03-27 18:52:10 -0700135 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
136 self.assertEqual(list(accumulate(s, min)),
137 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
138 self.assertEqual(list(accumulate(s, max)),
139 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
140 self.assertEqual(list(accumulate(s, operator.mul)),
141 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
142 with self.assertRaises(TypeError):
143 list(accumulate(s, chr)) # unary-operation
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000144 self.pickletest(accumulate(range(10))) # test pickling
Raymond Hettinger5d446132011-03-27 18:52:10 -0700145
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000146 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000147
148 def chain2(*iterables):
149 'Pure python version in the docs'
150 for it in iterables:
151 for element in it:
152 yield element
153
154 for c in (chain, chain2):
155 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
156 self.assertEqual(list(c('abc')), list('abc'))
157 self.assertEqual(list(c('')), [])
158 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
159 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000160
161 def test_chain_from_iterable(self):
162 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
163 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
164 self.assertEqual(list(chain.from_iterable([''])), [])
165 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
166 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000167
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000168 def test_chain_reducible(self):
169 operators = [copy.deepcopy,
170 lambda s: pickle.loads(pickle.dumps(s))]
171 for oper in operators:
172 it = chain('abc', 'def')
173 self.assertEqual(list(oper(it)), list('abcdef'))
174 self.assertEqual(next(it), 'a')
175 self.assertEqual(list(oper(it)), list('bcdef'))
176
177 self.assertEqual(list(oper(chain(''))), [])
178 self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
179 self.assertRaises(TypeError, list, oper(chain(2, 3)))
180 self.pickletest(chain('abc', 'def'), compare=list('abcdef'))
181
Christian Heimes380f7f22008-02-28 11:19:05 +0000182 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000183 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000184 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000185 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000186 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000187
188 for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
189 self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
190
191 self.assertEqual(list(op(combinations('ABCD', 2))),
192 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
193 testIntermediate = combinations('ABCD', 2)
194 next(testIntermediate)
195 self.assertEqual(list(op(testIntermediate)),
196 [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
197
198 self.assertEqual(list(op(combinations(range(4), 3))),
199 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
200 testIntermediate = combinations(range(4), 3)
201 next(testIntermediate)
202 self.assertEqual(list(op(testIntermediate)),
203 [(0,1,3), (0,2,3), (1,2,3)])
204
Christian Heimes78644762008-03-04 23:39:23 +0000205
206 def combinations1(iterable, r):
207 'Pure python version shown in the docs'
208 pool = tuple(iterable)
209 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000210 if r > n:
211 return
Christian Heimes78644762008-03-04 23:39:23 +0000212 indices = list(range(r))
213 yield tuple(pool[i] for i in indices)
214 while 1:
215 for i in reversed(range(r)):
216 if indices[i] != i + n - r:
217 break
218 else:
219 return
220 indices[i] += 1
221 for j in range(i+1, r):
222 indices[j] = indices[j-1] + 1
223 yield tuple(pool[i] for i in indices)
224
225 def combinations2(iterable, r):
226 'Pure python version shown in the docs'
227 pool = tuple(iterable)
228 n = len(pool)
229 for indices in permutations(range(n), r):
230 if sorted(indices) == list(indices):
231 yield tuple(pool[i] for i in indices)
232
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000233 def combinations3(iterable, r):
234 'Pure python version from cwr()'
235 pool = tuple(iterable)
236 n = len(pool)
237 for indices in combinations_with_replacement(range(n), r):
238 if len(set(indices)) == r:
239 yield tuple(pool[i] for i in indices)
240
Christian Heimes78644762008-03-04 23:39:23 +0000241 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000242 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000243 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000244 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000245 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # right number of combs
Christian Heimes380f7f22008-02-28 11:19:05 +0000246 self.assertEqual(len(result), len(set(result))) # no repeats
247 self.assertEqual(result, sorted(result)) # lexicographic order
248 for c in result:
249 self.assertEqual(len(c), r) # r-length combinations
250 self.assertEqual(len(set(c)), r) # no duplicate elements
251 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000252 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000253 self.assertEqual(list(c),
254 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000255 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000256 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000257 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000258
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000259 self.pickletest(combinations(values, r)) # test pickling
260
Benjamin Peterson4b40eeb2015-02-01 20:59:00 -0500261 @support.bigaddrspacetest
262 def test_combinations_overflow(self):
263 with self.assertRaises(OverflowError):
264 combinations("AA", 2**29)
265
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000266 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700267 @support.impl_detail("tuple reuse is specific to CPython")
268 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000269 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
270 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
271
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000272 def test_combinations_with_replacement(self):
273 cwr = combinations_with_replacement
274 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
275 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
276 self.assertRaises(TypeError, cwr, None) # pool is not iterable
277 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000278
279 for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
280 self.assertEqual(list(op(cwr('ABC', 2))),
281 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
282 testIntermediate = cwr('ABC', 2)
283 next(testIntermediate)
284 self.assertEqual(list(op(testIntermediate)),
285 [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
286
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000287
288 def cwr1(iterable, r):
289 'Pure python version shown in the docs'
290 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
291 pool = tuple(iterable)
292 n = len(pool)
293 if not n and r:
294 return
295 indices = [0] * r
296 yield tuple(pool[i] for i in indices)
297 while 1:
298 for i in reversed(range(r)):
299 if indices[i] != n - 1:
300 break
301 else:
302 return
303 indices[i:] = [indices[i] + 1] * (r - i)
304 yield tuple(pool[i] for i in indices)
305
306 def cwr2(iterable, r):
307 'Pure python version shown in the docs'
308 pool = tuple(iterable)
309 n = len(pool)
310 for indices in product(range(n), repeat=r):
311 if sorted(indices) == list(indices):
312 yield tuple(pool[i] for i in indices)
313
314 def numcombs(n, r):
315 if not n:
316 return 0 if r else 1
317 return fact(n+r-1) / fact(r)/ fact(n-1)
318
319 for n in range(7):
320 values = [5*x-12 for x in range(n)]
321 for r in range(n+2):
322 result = list(cwr(values, r))
323
324 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
325 self.assertEqual(len(result), len(set(result))) # no repeats
326 self.assertEqual(result, sorted(result)) # lexicographic order
327
328 regular_combs = list(combinations(values, r)) # compare to combs without replacement
329 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000330 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000331 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000332 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000333
334 for c in result:
335 self.assertEqual(len(c), r) # r-length combinations
336 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
337 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
338 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000339 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000340 self.assertEqual(noruns,
341 [e for e in values if e in c]) # comb is a subsequence of the input iterable
342 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
343 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
344
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000345 self.pickletest(cwr(values,r)) # test pickling
346
Benjamin Peterson6f082292015-02-01 21:10:47 -0500347 @support.bigaddrspacetest
348 def test_combinations_with_replacement_overflow(self):
349 with self.assertRaises(OverflowError):
350 combinations_with_replacement("AA", 2**30)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000351
Benjamin Peterson6f082292015-02-01 21:10:47 -0500352 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700353 @support.impl_detail("tuple reuse is specific to CPython")
354 def test_combinations_with_replacement_tuple_reuse(self):
355 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000356 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
357 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
358
Christian Heimes78644762008-03-04 23:39:23 +0000359 def test_permutations(self):
360 self.assertRaises(TypeError, permutations) # too few arguments
361 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000362 self.assertRaises(TypeError, permutations, None) # pool is not iterable
363 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000364 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000365 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000366 self.assertEqual(list(permutations(range(3), 2)),
367 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
368
369 def permutations1(iterable, r=None):
370 'Pure python version shown in the docs'
371 pool = tuple(iterable)
372 n = len(pool)
373 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000374 if r > n:
375 return
Christian Heimes78644762008-03-04 23:39:23 +0000376 indices = list(range(n))
377 cycles = list(range(n-r+1, n+1))[::-1]
378 yield tuple(pool[i] for i in indices[:r])
379 while n:
380 for i in reversed(range(r)):
381 cycles[i] -= 1
382 if cycles[i] == 0:
383 indices[i:] = indices[i+1:] + indices[i:i+1]
384 cycles[i] = n - i
385 else:
386 j = cycles[i]
387 indices[i], indices[-j] = indices[-j], indices[i]
388 yield tuple(pool[i] for i in indices[:r])
389 break
390 else:
391 return
392
393 def permutations2(iterable, r=None):
394 'Pure python version shown in the docs'
395 pool = tuple(iterable)
396 n = len(pool)
397 r = n if r is None else r
398 for indices in product(range(n), repeat=r):
399 if len(set(indices)) == r:
400 yield tuple(pool[i] for i in indices)
401
402 for n in range(7):
403 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000404 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000405 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000406 self.assertEqual(len(result), 0 if r>n else fact(n) / fact(n-r)) # right number of perms
Christian Heimes78644762008-03-04 23:39:23 +0000407 self.assertEqual(len(result), len(set(result))) # no repeats
408 self.assertEqual(result, sorted(result)) # lexicographic order
409 for p in result:
410 self.assertEqual(len(p), r) # r-length permutations
411 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000412 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000413 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000414 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000415 if r == n:
416 self.assertEqual(result, list(permutations(values, None))) # test r as None
417 self.assertEqual(result, list(permutations(values))) # test default r
418
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000419 self.pickletest(permutations(values, r)) # test pickling
420
Alex Gaynore151d212011-07-17 16:21:30 -0700421 @support.impl_detail("tuple resuse is CPython specific")
422 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000423 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000424 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000425
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000426 def test_combinatorics(self):
427 # Test relationships between product(), permutations(),
428 # combinations() and combinations_with_replacement().
429
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000430 for n in range(6):
431 s = 'ABCDEFG'[:n]
432 for r in range(8):
433 prod = list(product(s, repeat=r))
434 cwr = list(combinations_with_replacement(s, r))
435 perm = list(permutations(s, r))
436 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000437
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000438 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000439 self.assertEqual(len(prod), n**r)
440 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
441 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
442 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000443
444 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000445 self.assertEqual(prod, sorted(set(prod)))
446 self.assertEqual(cwr, sorted(set(cwr)))
447 self.assertEqual(perm, sorted(set(perm)))
448 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000449
450 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000451 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
452 self.assertEqual(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000453 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
454 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
455 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
456 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
457 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000458
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000459 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000460 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000461 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
462 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
463 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
464 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
465 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
466 n = 10000
467 data = chain.from_iterable(repeat(range(6), n))
468 selectors = chain.from_iterable(repeat((0, 1)))
469 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
470 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
471 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
472 self.assertRaises(TypeError, compress, range(6)) # too few args
473 self.assertRaises(TypeError, compress, range(6), None) # too many args
474
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000475 # check copy, deepcopy, pickle
476 for op in (lambda a:copy.copy(a), lambda a:copy.deepcopy(a), lambda a:pickle.loads(pickle.dumps(a))):
477 for data, selectors, result1, result2 in [
478 ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
479 ('ABCDEF', [0,0,0,0,0,0], '', ''),
480 ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
481 ('ABCDEF', [1,0,1], 'AC', 'C'),
482 ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
483 ]:
484
485 self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
486 self.assertEqual(list(op(compress(data, selectors))), list(result1))
487 testIntermediate = compress(data, selectors)
488 if result1:
489 next(testIntermediate)
490 self.assertEqual(list(op(testIntermediate)), list(result2))
491
492
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000493 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000494 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
495 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
496 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000497 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
498 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000499 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000500 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000501 self.assertEqual(list(islice(count(maxsize-5), 10)),
502 list(range(maxsize-5, maxsize+5)))
503 self.assertEqual(list(islice(count(-maxsize-5), 10)),
504 list(range(-maxsize-5, -maxsize+5)))
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000505 self.assertEqual(list(islice(count(10, maxsize+5), 3)),
506 list(range(10, 10+3*(maxsize+5), maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000507 c = count(3)
508 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000509 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000510 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000511 c = count(-9)
512 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000513 next(c)
Raymond Hettinger30729212009-02-12 06:28:27 +0000514 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000515 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000516 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300517 # Test repr
518 r1 = repr(count(i))
519 r2 = 'count(%r)'.__mod__(i)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000520 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000521
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000522 # check copy, deepcopy, pickle
523 for value in -3, 3, maxsize-5, maxsize+5:
524 c = count(value)
525 self.assertEqual(next(copy.copy(c)), value)
526 self.assertEqual(next(copy.deepcopy(c)), value)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000527 self.pickletest(count(value))
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000528
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000529 #check proper internal error handling for large "step' sizes
530 count(1, maxsize+5); sys.exc_info()
531
Raymond Hettinger30729212009-02-12 06:28:27 +0000532 def test_count_with_stride(self):
533 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000534 self.assertEqual(lzip('abc',count(start=2,step=3)),
535 [('a', 2), ('b', 5), ('c', 8)])
536 self.assertEqual(lzip('abc',count(step=-1)),
537 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000538 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
539 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000540 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000541 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
542 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
543 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000544 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
545 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000546 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
547 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000548 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
549 c = count(3, 5)
550 self.assertEqual(repr(c), 'count(3, 5)')
551 next(c)
552 self.assertEqual(repr(c), 'count(8, 5)')
553 c = count(-9, 0)
554 self.assertEqual(repr(c), 'count(-9, 0)')
555 next(c)
556 self.assertEqual(repr(c), 'count(-9, 0)')
557 c = count(-9, -3)
558 self.assertEqual(repr(c), 'count(-9, -3)')
559 next(c)
560 self.assertEqual(repr(c), 'count(-12, -3)')
561 self.assertEqual(repr(c), 'count(-12, -3)')
562 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
563 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
564 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
565 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
566 for j in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 1, 10, sys.maxsize-5, sys.maxsize+5):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300567 # Test repr
568 r1 = repr(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000569 if j == 1:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300570 r2 = ('count(%r)' % i)
Raymond Hettinger30729212009-02-12 06:28:27 +0000571 else:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300572 r2 = ('count(%r, %r)' % (i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000573 self.assertEqual(r1, r2)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000574 self.pickletest(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000575
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000576 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000577 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000578 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000579 self.assertRaises(TypeError, cycle)
580 self.assertRaises(TypeError, cycle, 5)
581 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000582
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000583 # check copy, deepcopy, pickle
584 c = cycle('abc')
585 self.assertEqual(next(c), 'a')
586 #simple copy currently not supported, because __reduce__ returns
587 #an internal iterator
588 #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
589 self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
590 self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('bcabcabcab'))
591 next(c)
592 self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('cabcabcabc'))
593 self.pickletest(cycle('abc'))
594
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000595 def test_groupby(self):
596 # Check whether it accepts arguments correctly
597 self.assertEqual([], list(groupby([])))
598 self.assertEqual([], list(groupby([], key=id)))
599 self.assertRaises(TypeError, list, groupby('abc', []))
600 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000601 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000602
603 # Check normal input
604 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
605 (2,15,22), (3,16,23), (3,17,23)]
606 dup = []
607 for k, g in groupby(s, lambda r:r[0]):
608 for elem in g:
609 self.assertEqual(k, elem[0])
610 dup.append(elem)
611 self.assertEqual(s, dup)
612
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000613 # Check normal pickled
614 dup = []
615 for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
616 for elem in g:
617 self.assertEqual(k, elem[0])
618 dup.append(elem)
619 self.assertEqual(s, dup)
620
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000621 # Check nested case
622 dup = []
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000623 for k, g in groupby(s, testR):
624 for ik, ig in groupby(g, testR2):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000625 for elem in ig:
626 self.assertEqual(k, elem[0])
627 self.assertEqual(ik, elem[2])
628 dup.append(elem)
629 self.assertEqual(s, dup)
630
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000631 # Check nested and pickled
632 dup = []
633 for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
634 for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2))):
635 for elem in ig:
636 self.assertEqual(k, elem[0])
637 self.assertEqual(ik, elem[2])
638 dup.append(elem)
639 self.assertEqual(s, dup)
640
641
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000642 # Check case where inner iterator is not used
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000643 keys = [k for k, g in groupby(s, testR)]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000644 expectedkeys = set([r[0] for r in s])
645 self.assertEqual(set(keys), expectedkeys)
646 self.assertEqual(len(keys), len(expectedkeys))
647
648 # Exercise pipes and filters style
649 s = 'abracadabra'
650 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000651 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000652 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
653 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000654 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000655 self.assertEqual(r, ['a', 'b', 'r'])
656 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000657 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000658 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
659 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000660 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000661 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
662
Georg Brandla18af4e2007-04-21 15:47:16 +0000663 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000664 class ExpectedError(Exception):
665 pass
666 def delayed_raise(n=0):
667 for i in range(n):
668 yield 'yo'
669 raise ExpectedError
670 def gulp(iterable, keyp=None, func=list):
671 return [func(g) for k, g in groupby(iterable, keyp)]
672
Georg Brandla18af4e2007-04-21 15:47:16 +0000673 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000674 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000675 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000676 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
677
678 # __cmp__ failure
679 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000680 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000681 raise ExpectedError
682 s = [DummyCmp(), DummyCmp(), None]
683
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000684 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000685 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000686 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000687 self.assertRaises(ExpectedError, gulp, s)
688
689 # keyfunc failure
690 def keyfunc(obj):
691 if keyfunc.skip > 0:
692 keyfunc.skip -= 1
693 return obj
694 else:
695 raise ExpectedError
696
697 # keyfunc failure on outer object
698 keyfunc.skip = 0
699 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
700 keyfunc.skip = 1
701 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
702
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000703 def test_filter(self):
704 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
705 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
706 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
707 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
708 self.assertRaises(TypeError, filter)
709 self.assertRaises(TypeError, filter, lambda x:x)
710 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
711 self.assertRaises(TypeError, filter, isEven, 3)
712 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000713
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000714 # check copy, deepcopy, pickle
715 ans = [0,2,4]
716
717 c = filter(isEven, range(6))
718 self.assertEqual(list(copy.copy(c)), ans)
719 c = filter(isEven, range(6))
720 self.assertEqual(list(copy.deepcopy(c)), ans)
721 c = filter(isEven, range(6))
722 self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans)
723 next(c)
724 self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans[1:])
725 c = filter(isEven, range(6))
726 self.pickletest(c)
727
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000728 def test_filterfalse(self):
729 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
730 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
731 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
732 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
733 self.assertRaises(TypeError, filterfalse)
734 self.assertRaises(TypeError, filterfalse, lambda x:x)
735 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
736 self.assertRaises(TypeError, filterfalse, isEven, 3)
737 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000738 self.pickletest(filterfalse(isEven, range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000739
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000740 def test_zip(self):
741 # XXX This is rather silly now that builtin zip() calls zip()...
742 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000743 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000744 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
745 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
746 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
747 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
748 self.assertEqual(list(zip()), lzip())
749 self.assertRaises(TypeError, zip, 3)
750 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000751 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000752 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000753 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000754 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700755
756 @support.impl_detail("tuple reuse is specific to CPython")
757 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000758 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000759 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000760 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000761 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000762
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000763 # check copy, deepcopy, pickle
764 ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
765 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
766
767 ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
768 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
769
770 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count())))]
771 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
772
773 testIntermediate = zip('abc',count())
774 next(testIntermediate)
775 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate))]
776 self.assertEqual(ans, [('b', 1), ('c', 2)])
777
778 self.pickletest(zip('abc', count()))
779
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000780 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000781 for args in [
782 ['abc', range(6)],
783 [range(6), 'abc'],
784 [range(1000), range(2000,2100), range(3000,3050)],
785 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
786 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
787 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000788 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
789 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000790 self.assertEqual(list(zip_longest(*args)), target)
791 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000792 target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X'
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000793 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000794
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000795 self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input
Thomas Wouterscf297e42007-02-23 15:07:44 +0000796
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000797 self.assertEqual(list(zip_longest()), list(zip()))
798 self.assertEqual(list(zip_longest([])), list(zip([])))
799 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000800
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000801 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000802 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000803 self.assertRaises(TypeError, zip_longest, 3)
804 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000805
806 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000807 "zip_longest('abc', fv=1)",
808 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000809 ]:
810 try:
811 eval(stmt, globals(), locals())
812 except TypeError:
813 pass
814 else:
815 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000816
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000817 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000818 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000819 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000820 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700821
822 @support.impl_detail("tuple reuse is specific to CPython")
823 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000824 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000825 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000826 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000827 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
828
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000829 def test_zip_longest_pickling(self):
830 self.pickletest(zip_longest("abc", "def"))
831 self.pickletest(zip_longest("abc", "defgh"))
832 self.pickletest(zip_longest("abc", "defgh", fillvalue=1))
833 self.pickletest(zip_longest("", "defgh"))
834
Raymond Hettingerfc438512009-11-01 20:55:33 +0000835 def test_bug_7244(self):
836
837 class Repeater:
838 # this class is similar to itertools.repeat
839 def __init__(self, o, t, e):
840 self.o = o
841 self.t = int(t)
842 self.e = e
843 def __iter__(self): # its iterator is itself
844 return self
845 def __next__(self):
846 if self.t > 0:
847 self.t -= 1
848 return self.o
849 else:
850 raise self.e
851
852 # Formerly this code in would fail in debug mode
853 # with Undetected Error and Stop Iteration
854 r1 = Repeater(1, 3, StopIteration)
855 r2 = Repeater(2, 4, StopIteration)
856 def run(r1, r2):
857 result = []
858 for i, j in zip_longest(r1, r2, fillvalue=0):
859 with support.captured_output('stdout'):
860 print((i, j))
861 result.append((i, j))
862 return result
863 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
864
865 # Formerly, the RuntimeError would be lost
866 # and StopIteration would stop as expected
867 r1 = Repeater(1, 3, RuntimeError)
868 r2 = Repeater(2, 4, StopIteration)
869 it = zip_longest(r1, r2, fillvalue=0)
870 self.assertEqual(next(it), (1, 2))
871 self.assertEqual(next(it), (1, 2))
872 self.assertEqual(next(it), (1, 2))
873 self.assertRaises(RuntimeError, next, it)
874
Christian Heimesc3f30c42008-02-22 16:37:40 +0000875 def test_product(self):
876 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000877 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000878 (['ab'], [('a',), ('b',)]), # one iterable
879 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
880 ([range(0), range(2), range(3)], []), # first iterable with zero length
881 ([range(2), range(0), range(3)], []), # middle iterable with zero length
882 ([range(2), range(3), range(0)], []), # last iterable with zero length
883 ]:
884 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000885 for r in range(4):
886 self.assertEqual(list(product(*(args*r))),
887 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000888 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
889 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000890
891 def product1(*args, **kwds):
892 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
893 n = len(pools)
894 if n == 0:
895 yield ()
896 return
897 if any(len(pool) == 0 for pool in pools):
898 return
899 indices = [0] * n
900 yield tuple(pool[i] for pool, i in zip(pools, indices))
901 while 1:
902 for i in reversed(range(n)): # right to left
903 if indices[i] == len(pools[i]) - 1:
904 continue
905 indices[i] += 1
906 for j in range(i+1, n):
907 indices[j] = 0
908 yield tuple(pool[i] for pool, i in zip(pools, indices))
909 break
910 else:
911 return
912
913 def product2(*args, **kwds):
914 'Pure python version used in docs'
915 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
916 result = [[]]
917 for pool in pools:
918 result = [x+[y] for x in result for y in pool]
919 for prod in result:
920 yield tuple(prod)
921
Christian Heimesc3f30c42008-02-22 16:37:40 +0000922 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
923 set('abcdefg'), range(11), tuple(range(13))]
924 for i in range(100):
925 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000926 expected_len = prod(map(len, args))
927 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000928 self.assertEqual(list(product(*args)), list(product1(*args)))
929 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000930 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000931 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000932
Alex Gaynore151d212011-07-17 16:21:30 -0700933 @support.impl_detail("tuple reuse is specific to CPython")
934 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000935 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
936 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000937
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000938 def test_product_pickling(self):
939 # check copy, deepcopy, pickle
940 for args, result in [
941 ([], [()]), # zero iterables
942 (['ab'], [('a',), ('b',)]), # one iterable
943 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
944 ([range(0), range(2), range(3)], []), # first iterable with zero length
945 ([range(2), range(0), range(3)], []), # middle iterable with zero length
946 ([range(2), range(3), range(0)], []), # last iterable with zero length
947 ]:
948 self.assertEqual(list(copy.copy(product(*args))), result)
949 self.assertEqual(list(copy.deepcopy(product(*args))), result)
950 self.pickletest(product(*args))
951
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000952 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +0000953 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +0000954 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000955 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000956 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000957 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000958 self.assertEqual(list(repeat('a', 0)), [])
959 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000960 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000961 self.assertRaises(TypeError, repeat, None, 3, 4)
962 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000963 r = repeat(1+0j)
964 self.assertEqual(repr(r), 'repeat((1+0j))')
965 r = repeat(1+0j, 5)
966 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
967 list(r)
968 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000969
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000970 # check copy, deepcopy, pickle
971 c = repeat(object='a', times=10)
972 self.assertEqual(next(c), 'a')
973 self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
974 self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
975 self.pickletest(repeat(object='a', times=10))
976
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000977 def test_map(self):
978 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000979 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000980 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000981 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000982 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000983 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000984 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000985 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000986 self.assertEqual(list(map(operator.pow, [])), [])
987 self.assertRaises(TypeError, map)
988 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
989 self.assertRaises(TypeError, map, operator.neg)
990 self.assertRaises(TypeError, next, map(10, range(5)))
991 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
992 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000993
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000994 # check copy, deepcopy, pickle
995 ans = [('a',0),('b',1),('c',2)]
996
997 c = map(tupleize, 'abc', count())
998 self.assertEqual(list(copy.copy(c)), ans)
999
1000 c = map(tupleize, 'abc', count())
1001 self.assertEqual(list(copy.deepcopy(c)), ans)
1002
1003 c = map(tupleize, 'abc', count())
1004 self.pickletest(c)
1005
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001006 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001007 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
1008 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001009 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +00001010 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001011 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +00001012 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
1013 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001014 self.assertRaises(TypeError, starmap)
1015 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001016 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
1017 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
1018 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001019
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001020 # check copy, deepcopy, pickle
1021 ans = [0**1, 1**2, 2**3]
1022
1023 c = starmap(operator.pow, zip(range(3), range(1,7)))
1024 self.assertEqual(list(copy.copy(c)), ans)
1025
1026 c = starmap(operator.pow, zip(range(3), range(1,7)))
1027 self.assertEqual(list(copy.deepcopy(c)), ans)
1028
1029 c = starmap(operator.pow, zip(range(3), range(1,7)))
1030 self.pickletest(c)
1031
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001032 def test_islice(self):
1033 for args in [ # islice(args) should agree with range(args)
1034 (10, 20, 3),
1035 (10, 3, 20),
1036 (10, 20),
1037 (10, 3),
1038 (20,)
1039 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001040 self.assertEqual(list(islice(range(100), *args)),
1041 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001042
1043 for args, tgtargs in [ # Stop when seqn is exhausted
1044 ((10, 110, 3), ((10, 100, 3))),
1045 ((10, 110), ((10, 100))),
1046 ((110,), (100,))
1047 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001048 self.assertEqual(list(islice(range(100), *args)),
1049 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001050
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001051 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +00001052 self.assertEqual(list(islice(range(10), None)), list(range(10)))
1053 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
1054 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
1055 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
1056 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001057
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001058 # Test number of items consumed SF #1171417
1059 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001060 self.assertEqual(list(islice(it, 3)), list(range(3)))
1061 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001062
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001063 # Test invalid arguments
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001064 ra = range(10)
1065 self.assertRaises(TypeError, islice, ra)
1066 self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
1067 self.assertRaises(ValueError, islice, ra, -5, 10, 1)
1068 self.assertRaises(ValueError, islice, ra, 1, -5, -1)
1069 self.assertRaises(ValueError, islice, ra, 1, 10, -1)
1070 self.assertRaises(ValueError, islice, ra, 1, 10, 0)
1071 self.assertRaises(ValueError, islice, ra, 'a')
1072 self.assertRaises(ValueError, islice, ra, 'a', 1)
1073 self.assertRaises(ValueError, islice, ra, 1, 'a')
1074 self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
1075 self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +00001076 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001077
Raymond Hettinger69b34bf2010-11-30 02:49:29 +00001078 # Issue #10323: Less islice in a predictable state
1079 c = count()
1080 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
1081 self.assertEqual(next(c), 3)
1082
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001083 # check copy, deepcopy, pickle
1084 for args in [ # islice(args) should agree with range(args)
1085 (10, 20, 3),
1086 (10, 3, 20),
1087 (10, 20),
1088 (10, 3),
1089 (20,)
1090 ]:
1091 self.assertEqual(list(copy.copy(islice(range(100), *args))),
1092 list(range(*args)))
1093 self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
1094 list(range(*args)))
1095 self.pickletest(islice(range(100), *args))
1096
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001097 def test_takewhile(self):
1098 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001099 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001100 self.assertEqual(list(takewhile(underten, [])), [])
1101 self.assertRaises(TypeError, takewhile)
1102 self.assertRaises(TypeError, takewhile, operator.pow)
1103 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001104 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
1105 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001106 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
1107 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +00001108 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001109
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001110 # check copy, deepcopy, pickle
1111 self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
1112 self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
1113 [1, 3, 5])
1114 self.pickletest(takewhile(underten, data))
1115
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001116 def test_dropwhile(self):
1117 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001118 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001119 self.assertEqual(list(dropwhile(underten, [])), [])
1120 self.assertRaises(TypeError, dropwhile)
1121 self.assertRaises(TypeError, dropwhile, operator.pow)
1122 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001123 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
1124 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001125
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001126 # check copy, deepcopy, pickle
1127 self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
1128 self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
1129 [20, 2, 4, 6, 8])
1130 self.pickletest(dropwhile(underten, data))
1131
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001132 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +00001133 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001134
1135 a, b = tee([]) # test empty iterator
1136 self.assertEqual(list(a), [])
1137 self.assertEqual(list(b), [])
1138
1139 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +00001140 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001141
1142 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +00001143 self.assertEqual(list(a), list(range(n)))
1144 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001145
1146 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001147 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001148 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001149 del a
Guido van Rossum805365e2007-05-07 22:24:25 +00001150 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001151
1152 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001153 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001154 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001155 del b
Guido van Rossum805365e2007-05-07 22:24:25 +00001156 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001157
Guido van Rossum805365e2007-05-07 22:24:25 +00001158 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001159 order = [0]*n + [1]*n
1160 random.shuffle(order)
1161 lists = ([], [])
1162 its = tee(irange(n))
1163 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +00001164 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001165 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +00001166 self.assertEqual(lists[0], list(range(n)))
1167 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001168
Raymond Hettingerad983e72003-11-12 14:32:26 +00001169 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001170 self.assertRaises(TypeError, tee)
1171 self.assertRaises(TypeError, tee, 3)
1172 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +00001173 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001174
Raymond Hettingerad983e72003-11-12 14:32:26 +00001175 # tee object should be instantiable
1176 a, b = tee('abc')
1177 c = type(a)('def')
1178 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001179
Raymond Hettingerad983e72003-11-12 14:32:26 +00001180 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +00001181 a, b, c = tee(range(2000), 3)
1182 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001183 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +00001184 self.assertEqual(list(b), list(range(2000)))
1185 self.assertEqual([next(c), next(c)], list(range(2)))
1186 self.assertEqual(list(a), list(range(100,2000)))
1187 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +00001188
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001189 # test values of n
1190 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001191 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +00001192 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001193 result = tee('abc', n)
1194 self.assertEqual(type(result), tuple)
1195 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001196 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001197
Raymond Hettingerad983e72003-11-12 14:32:26 +00001198 # tee pass-through to copyable iterator
1199 a, b = tee('abc')
1200 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001201 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001202
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001203 # test tee_new
1204 t1, t2 = tee('abc')
1205 tnew = type(t1)
1206 self.assertRaises(TypeError, tnew)
1207 self.assertRaises(TypeError, tnew, 10)
1208 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001209 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001210
Raymond Hettingera9f60922004-10-17 16:40:14 +00001211 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +00001212 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +00001213 p = proxy(a)
1214 self.assertEqual(getattr(p, '__class__'), type(b))
1215 del a
1216 self.assertRaises(ReferenceError, getattr, p, '__class__')
1217
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001218 ans = list('abc')
1219 long_ans = list(range(10000))
1220
1221 # check copy
1222 a, b = tee('abc')
1223 self.assertEqual(list(copy.copy(a)), ans)
1224 self.assertEqual(list(copy.copy(b)), ans)
1225 a, b = tee(list(range(10000)))
1226 self.assertEqual(list(copy.copy(a)), long_ans)
1227 self.assertEqual(list(copy.copy(b)), long_ans)
1228
1229 # check partially consumed copy
1230 a, b = tee('abc')
1231 take(2, a)
1232 take(1, b)
1233 self.assertEqual(list(copy.copy(a)), ans[2:])
1234 self.assertEqual(list(copy.copy(b)), ans[1:])
1235 self.assertEqual(list(a), ans[2:])
1236 self.assertEqual(list(b), ans[1:])
1237 a, b = tee(range(10000))
1238 take(100, a)
1239 take(60, b)
1240 self.assertEqual(list(copy.copy(a)), long_ans[100:])
1241 self.assertEqual(list(copy.copy(b)), long_ans[60:])
1242 self.assertEqual(list(a), long_ans[100:])
1243 self.assertEqual(list(b), long_ans[60:])
1244
1245 # check deepcopy
1246 a, b = tee('abc')
1247 self.assertEqual(list(copy.deepcopy(a)), ans)
1248 self.assertEqual(list(copy.deepcopy(b)), ans)
1249 self.assertEqual(list(a), ans)
1250 self.assertEqual(list(b), ans)
1251 a, b = tee(range(10000))
1252 self.assertEqual(list(copy.deepcopy(a)), long_ans)
1253 self.assertEqual(list(copy.deepcopy(b)), long_ans)
1254 self.assertEqual(list(a), long_ans)
1255 self.assertEqual(list(b), long_ans)
1256
1257 # check partially consumed deepcopy
1258 a, b = tee('abc')
1259 take(2, a)
1260 take(1, b)
1261 self.assertEqual(list(copy.deepcopy(a)), ans[2:])
1262 self.assertEqual(list(copy.deepcopy(b)), ans[1:])
1263 self.assertEqual(list(a), ans[2:])
1264 self.assertEqual(list(b), ans[1:])
1265 a, b = tee(range(10000))
1266 take(100, a)
1267 take(60, b)
1268 self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
1269 self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
1270 self.assertEqual(list(a), long_ans[100:])
1271 self.assertEqual(list(b), long_ans[60:])
1272
1273 # check pickle
1274 self.pickletest(iter(tee('abc')))
1275 a, b = tee('abc')
1276 self.pickletest(a, compare=ans)
1277 self.pickletest(b, compare=ans)
1278
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001279 # Issue 13454: Crash when deleting backward iterator from tee()
1280 def test_tee_del_backward(self):
Serhiy Storchaka5bb893c2013-01-26 11:52:06 +02001281 forward, backward = tee(repeat(None, 20000000))
1282 any(forward) # exhaust the iterator
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001283 del backward
1284
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001285 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001286 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +00001287
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001288 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +00001289 self.assertRaises(StopIteration, next, f([]))
1290 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001291
Georg Brandla18af4e2007-04-21 15:47:16 +00001292 self.assertRaises(StopIteration, next, islice([], None))
1293 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001294
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001295 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +00001296 self.assertRaises(StopIteration, next, p)
1297 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001298 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +00001299 self.assertRaises(StopIteration, next, p)
1300 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001301
Georg Brandla18af4e2007-04-21 15:47:16 +00001302 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001303
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001304 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +00001305 self.assertRaises(StopIteration, next, f(lambda x:x, []))
1306 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001307
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001308class TestExamples(unittest.TestCase):
1309
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001310 def test_accumulate(self):
Raymond Hettinger482ba772010-12-01 22:48:00 +00001311 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
1312
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001313 def test_accumulate_reducible(self):
1314 # check copy, deepcopy, pickle
1315 data = [1, 2, 3, 4, 5]
1316 accumulated = [1, 3, 6, 10, 15]
1317 it = accumulate(data)
1318
1319 self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[:])
1320 self.assertEqual(next(it), 1)
1321 self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[1:])
1322 self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
1323 self.assertEqual(list(copy.copy(it)), accumulated[1:])
1324
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001325 def test_chain(self):
1326 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
1327
1328 def test_chain_from_iterable(self):
1329 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
1330
1331 def test_combinations(self):
1332 self.assertEqual(list(combinations('ABCD', 2)),
1333 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
1334 self.assertEqual(list(combinations(range(4), 3)),
1335 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
1336
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001337 def test_combinations_with_replacement(self):
1338 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
1339 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
1340
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001341 def test_compress(self):
1342 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1343
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001344 def test_count(self):
1345 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1346
1347 def test_cycle(self):
1348 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1349
1350 def test_dropwhile(self):
1351 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1352
1353 def test_groupby(self):
1354 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1355 list('ABCDAB'))
1356 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1357 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1358
1359 def test_filter(self):
1360 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1361
1362 def test_filterfalse(self):
1363 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1364
1365 def test_map(self):
1366 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1367
1368 def test_islice(self):
1369 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1370 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1371 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1372 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1373
1374 def test_zip(self):
1375 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1376
1377 def test_zip_longest(self):
1378 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1379 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1380
1381 def test_permutations(self):
1382 self.assertEqual(list(permutations('ABCD', 2)),
1383 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1384 self.assertEqual(list(permutations(range(3))),
1385 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1386
1387 def test_product(self):
1388 self.assertEqual(list(product('ABCD', 'xy')),
1389 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1390 self.assertEqual(list(product(range(2), repeat=3)),
1391 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1392 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1393
1394 def test_repeat(self):
1395 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1396
1397 def test_stapmap(self):
1398 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1399 [32, 9, 1000])
1400
1401 def test_takewhile(self):
1402 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1403
1404
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001405class TestGC(unittest.TestCase):
1406
1407 def makecycle(self, iterator, container):
1408 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001409 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001410 del container, iterator
1411
Raymond Hettinger482ba772010-12-01 22:48:00 +00001412 def test_accumulate(self):
1413 a = []
1414 self.makecycle(accumulate([1,2,a,3]), a)
1415
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001416 def test_chain(self):
1417 a = []
1418 self.makecycle(chain(a), a)
1419
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001420 def test_chain_from_iterable(self):
1421 a = []
1422 self.makecycle(chain.from_iterable([a]), a)
1423
1424 def test_combinations(self):
1425 a = []
1426 self.makecycle(combinations([1,2,a,3], 3), a)
1427
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001428 def test_combinations_with_replacement(self):
1429 a = []
1430 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1431
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001432 def test_compress(self):
1433 a = []
1434 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1435
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001436 def test_count(self):
1437 a = []
1438 Int = type('Int', (int,), dict(x=a))
1439 self.makecycle(count(Int(0), Int(1)), a)
1440
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001441 def test_cycle(self):
1442 a = []
1443 self.makecycle(cycle([a]*2), a)
1444
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001445 def test_dropwhile(self):
1446 a = []
1447 self.makecycle(dropwhile(bool, [0, a, a]), a)
1448
1449 def test_groupby(self):
1450 a = []
1451 self.makecycle(groupby([a]*2, lambda x:x), a)
1452
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001453 def test_issue2246(self):
1454 # Issue 2246 -- the _grouper iterator was not included in GC
1455 n = 10
1456 keyfunc = lambda x: x
1457 for i, j in groupby(range(n), key=keyfunc):
1458 keyfunc.__dict__.setdefault('x',[]).append(j)
1459
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001460 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001461 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001462 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001463
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001464 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001465 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001466 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001467
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001468 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001469 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001470 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001471
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001472 def test_zip_longest(self):
1473 a = []
1474 self.makecycle(zip_longest([a]*2, [a]*3), a)
1475 b = [a, None]
1476 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1477
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001478 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001479 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001480 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001481
1482 def test_islice(self):
1483 a = []
1484 self.makecycle(islice([a]*2, None), a)
1485
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001486 def test_permutations(self):
1487 a = []
1488 self.makecycle(permutations([1,2,a,3], 3), a)
1489
1490 def test_product(self):
1491 a = []
1492 self.makecycle(product([1,2,a,3], repeat=3), a)
1493
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001494 def test_repeat(self):
1495 a = []
1496 self.makecycle(repeat(a), a)
1497
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001498 def test_starmap(self):
1499 a = []
1500 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1501
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001502 def test_takewhile(self):
1503 a = []
1504 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1505
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001506def R(seqn):
1507 'Regular generator'
1508 for i in seqn:
1509 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001510
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001511class G:
1512 'Sequence using __getitem__'
1513 def __init__(self, seqn):
1514 self.seqn = seqn
1515 def __getitem__(self, i):
1516 return self.seqn[i]
1517
1518class I:
1519 'Sequence using iterator protocol'
1520 def __init__(self, seqn):
1521 self.seqn = seqn
1522 self.i = 0
1523 def __iter__(self):
1524 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001525 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001526 if self.i >= len(self.seqn): raise StopIteration
1527 v = self.seqn[self.i]
1528 self.i += 1
1529 return v
1530
1531class Ig:
1532 'Sequence using iterator protocol defined with a generator'
1533 def __init__(self, seqn):
1534 self.seqn = seqn
1535 self.i = 0
1536 def __iter__(self):
1537 for val in self.seqn:
1538 yield val
1539
1540class X:
1541 'Missing __getitem__ and __iter__'
1542 def __init__(self, seqn):
1543 self.seqn = seqn
1544 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001545 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001546 if self.i >= len(self.seqn): raise StopIteration
1547 v = self.seqn[self.i]
1548 self.i += 1
1549 return v
1550
1551class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001552 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001553 def __init__(self, seqn):
1554 self.seqn = seqn
1555 self.i = 0
1556 def __iter__(self):
1557 return self
1558
1559class E:
1560 'Test propagation of exceptions'
1561 def __init__(self, seqn):
1562 self.seqn = seqn
1563 self.i = 0
1564 def __iter__(self):
1565 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001566 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001567 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001568
1569class S:
1570 'Test immediate stop'
1571 def __init__(self, seqn):
1572 pass
1573 def __iter__(self):
1574 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001575 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001576 raise StopIteration
1577
1578def L(seqn):
1579 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001580 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001581
1582
1583class TestVariousIteratorArgs(unittest.TestCase):
1584
Raymond Hettinger482ba772010-12-01 22:48:00 +00001585 def test_accumulate(self):
1586 s = [1,2,3,4,5]
1587 r = [1,3,6,10,15]
1588 n = len(s)
1589 for g in (G, I, Ig, L, R):
1590 self.assertEqual(list(accumulate(g(s))), r)
1591 self.assertEqual(list(accumulate(S(s))), [])
1592 self.assertRaises(TypeError, accumulate, X(s))
1593 self.assertRaises(TypeError, accumulate, N(s))
1594 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1595
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001596 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001597 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001598 for g in (G, I, Ig, S, L, R):
1599 self.assertEqual(list(chain(g(s))), list(g(s)))
1600 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001601 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001602 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001603 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1604
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001605 def test_compress(self):
1606 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1607 n = len(s)
1608 for g in (G, I, Ig, S, L, R):
1609 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1610 self.assertRaises(TypeError, compress, X(s), repeat(1))
1611 self.assertRaises(TypeError, compress, N(s), repeat(1))
1612 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1613
Christian Heimesc3f30c42008-02-22 16:37:40 +00001614 def test_product(self):
1615 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1616 self.assertRaises(TypeError, product, X(s))
1617 self.assertRaises(TypeError, product, N(s))
1618 self.assertRaises(ZeroDivisionError, product, E(s))
1619
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001620 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001621 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001622 for g in (G, I, Ig, S, L, R):
1623 tgtlen = len(s) * 3
1624 expected = list(g(s))*3
1625 actual = list(islice(cycle(g(s)), tgtlen))
1626 self.assertEqual(actual, expected)
1627 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001628 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001629 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1630
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001631 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001632 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001633 for g in (G, I, Ig, S, L, R):
1634 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1635 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001636 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001637 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1638
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001639 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001640 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001641 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001642 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001643 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001644 self.assertRaises(TypeError, filter, isEven, X(s))
1645 self.assertRaises(TypeError, filter, isEven, N(s))
1646 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001647
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001648 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001649 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001650 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001651 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001652 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001653 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1654 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1655 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001656
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001657 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001658 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001659 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001660 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1661 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1662 self.assertRaises(TypeError, zip, X(s))
1663 self.assertRaises(TypeError, zip, N(s))
1664 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001665
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001666 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001667 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001668 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001669 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1670 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1671 self.assertRaises(TypeError, zip_longest, X(s))
1672 self.assertRaises(TypeError, zip_longest, N(s))
1673 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001674
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001675 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001676 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001677 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001678 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001679 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001680 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001681 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001682 self.assertRaises(TypeError, map, onearg, X(s))
1683 self.assertRaises(TypeError, map, onearg, N(s))
1684 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001685
1686 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001687 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001688 for g in (G, I, Ig, S, L, R):
1689 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1690 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001691 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001692 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1693
1694 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001695 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001696 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001697 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001698 self.assertEqual(list(starmap(operator.pow, g(ss))),
1699 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001700 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001701 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001702 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1703
1704 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001705 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001706 for g in (G, I, Ig, S, L, R):
1707 tgt = []
1708 for elem in g(s):
1709 if not isEven(elem): break
1710 tgt.append(elem)
1711 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1712 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001713 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001714 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1715
1716 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001717 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001718 for g in (G, I, Ig, S, L, R):
1719 tgt = []
1720 for elem in g(s):
1721 if not tgt and isOdd(elem): continue
1722 tgt.append(elem)
1723 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1724 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001725 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001726 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1727
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001728 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001729 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001730 for g in (G, I, Ig, S, L, R):
1731 it1, it2 = tee(g(s))
1732 self.assertEqual(list(it1), list(g(s)))
1733 self.assertEqual(list(it2), list(g(s)))
1734 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001735 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001736 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1737
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001738class LengthTransparency(unittest.TestCase):
1739
1740 def test_repeat(self):
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001741 from test.test_iterlen import len
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001742 self.assertEqual(len(repeat(None, 50)), 50)
1743 self.assertRaises(TypeError, len, repeat(None))
1744
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001745class RegressionTests(unittest.TestCase):
1746
1747 def test_sf_793826(self):
1748 # Fix Armin Rigo's successful efforts to wreak havoc
1749
1750 def mutatingtuple(tuple1, f, tuple2):
1751 # this builds a tuple t which is a copy of tuple1,
1752 # then calls f(t), then mutates t to be equal to tuple2
1753 # (needs len(tuple1) == len(tuple2)).
1754 def g(value, first=[1]):
1755 if first:
1756 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001757 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001758 return value
1759 items = list(tuple2)
1760 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001761 gen = map(g, items)
1762 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001763 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001764
1765 def f(t):
1766 global T
1767 T = t
1768 first[:] = list(T)
1769
1770 first = []
1771 mutatingtuple((1,2,3), f, (4,5,6))
1772 second = list(T)
1773 self.assertEqual(first, second)
1774
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001775
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001776 def test_sf_950057(self):
1777 # Make sure that chain() and cycle() catch exceptions immediately
1778 # rather than when shifting between input sources
1779
1780 def gen1():
1781 hist.append(0)
1782 yield 1
1783 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001784 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001785 hist.append(2)
1786
1787 def gen2(x):
1788 hist.append(3)
1789 yield 2
1790 hist.append(4)
1791 if x:
1792 raise StopIteration
1793
1794 hist = []
1795 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1796 self.assertEqual(hist, [0,1])
1797
1798 hist = []
1799 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1800 self.assertEqual(hist, [0,1])
1801
1802 hist = []
1803 self.assertRaises(AssertionError, list, cycle(gen1()))
1804 self.assertEqual(hist, [0,1])
1805
Thomas Woutersb2137042007-02-01 18:02:27 +00001806class SubclassWithKwargsTest(unittest.TestCase):
1807 def test_keywords_in_subclass(self):
1808 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001809 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001810 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001811 class Subclass(cls):
1812 def __init__(self, newarg=None, *args):
1813 cls.__init__(self, *args)
1814 try:
1815 Subclass(newarg=1)
1816 except TypeError as err:
1817 # we expect type errors because of wrong argument count
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001818 self.assertNotIn("does not take keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00001819
1820
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001821libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001822
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001823
1824>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001825>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001826... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001827...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001828Check 1200 is for $120.15
1829Check 1201 is for $764.05
1830Check 1202 is for $823.14
1831
1832>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001833>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001834... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001835...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000018361
18378
183827
1839
1840>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001841>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001842... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001843...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001844Alex
1845Laura
1846Martin
1847Walter
1848Samuele
1849
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001850>>> from operator import itemgetter
1851>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001852>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001853>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001854... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001855...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000018561 ['a', 'c', 'e']
18572 ['b', 'd', 'f']
18583 ['g']
1859
Raymond Hettinger734fb572004-01-20 20:04:40 +00001860# Find runs of consecutive numbers using groupby. The key to the solution
1861# is differencing with a range so that consecutive numbers all appear in
1862# same group.
1863>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001864>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001865... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001866...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001867[1]
1868[4, 5, 6]
1869[10]
1870[15, 16, 17, 18]
1871[22]
1872[25, 26, 27, 28]
1873
Georg Brandl3dbca812008-07-23 16:10:53 +00001874>>> def take(n, iterable):
1875... "Return first n items of the iterable as a list"
1876... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001877
Georg Brandl3dbca812008-07-23 16:10:53 +00001878>>> def enumerate(iterable, start=0):
1879... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001880
Georg Brandl3dbca812008-07-23 16:10:53 +00001881>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001882... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001883... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001884
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00001885>>> def nth(iterable, n, default=None):
1886... "Returns the nth item or a default value"
1887... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001888
Georg Brandl3dbca812008-07-23 16:10:53 +00001889>>> def quantify(iterable, pred=bool):
1890... "Count how many times the predicate is true"
1891... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001892
Georg Brandl3dbca812008-07-23 16:10:53 +00001893>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001894... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001895... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001896
Georg Brandl3dbca812008-07-23 16:10:53 +00001897>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02001898... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00001899... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001900
1901>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001902... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001903
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001904>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001905... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001906
1907>>> def repeatfunc(func, times=None, *args):
1908... "Repeat calls to func with specified arguments."
1909... " Example: repeatfunc(random.random)"
1910... if times is None:
1911... return starmap(func, repeat(args))
1912... else:
1913... return starmap(func, repeat(args, times))
1914
Raymond Hettingerd591f662003-10-26 15:34:50 +00001915>>> def pairwise(iterable):
1916... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1917... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001918... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001919... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001920... except StopIteration:
1921... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001922... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001923
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001924>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001925... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001926... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001927... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001928
1929>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001930... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001931... # Recipe credited to George Sakkis
1932... pending = len(iterables)
1933... nexts = cycle(iter(it).__next__ for it in iterables)
1934... while pending:
1935... try:
1936... for next in nexts:
1937... yield next()
1938... except StopIteration:
1939... pending -= 1
1940... nexts = cycle(islice(nexts, pending))
1941
1942>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001943... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1944... s = list(iterable)
1945... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001946
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001947>>> def unique_everseen(iterable, key=None):
1948... "List unique elements, preserving order. Remember all elements ever seen."
1949... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1950... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1951... seen = set()
1952... seen_add = seen.add
1953... if key is None:
1954... for element in iterable:
1955... if element not in seen:
1956... seen_add(element)
1957... yield element
1958... else:
1959... for element in iterable:
1960... k = key(element)
1961... if k not in seen:
1962... seen_add(k)
1963... yield element
1964
1965>>> def unique_justseen(iterable, key=None):
1966... "List unique elements, preserving order. Remember only the element just seen."
1967... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1968... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1969... return map(next, map(itemgetter(1), groupby(iterable, key)))
1970
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001971This is not part of the examples but it tests to make sure the definitions
1972perform as purported.
1973
Raymond Hettingera098b332003-09-08 23:58:40 +00001974>>> take(10, count())
1975[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1976
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001977>>> list(enumerate('abc'))
1978[(0, 'a'), (1, 'b'), (2, 'c')]
1979
1980>>> list(islice(tabulate(lambda x: 2*x), 4))
1981[0, 2, 4, 6]
1982
1983>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00001984'd'
1985
1986>>> nth('abcde', 9) is None
1987True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001988
Guido van Rossum805365e2007-05-07 22:24:25 +00001989>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000199050
1991
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001992>>> a = [[1, 2, 3], [4, 5, 6]]
1993>>> flatten(a)
1994[1, 2, 3, 4, 5, 6]
1995
1996>>> list(repeatfunc(pow, 5, 2, 3))
1997[8, 8, 8, 8, 8]
1998
1999>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002000>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002001[0, 0, 0, 0, 0]
2002
Raymond Hettingerd591f662003-10-26 15:34:50 +00002003>>> list(pairwise('abcd'))
2004[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002005
Raymond Hettingerd591f662003-10-26 15:34:50 +00002006>>> list(pairwise([]))
2007[]
2008
2009>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00002010[]
2011
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002012>>> list(islice(padnone('abc'), 0, 6))
2013['a', 'b', 'c', None, None, None]
2014
2015>>> list(ncycles('abc', 3))
2016['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
2017
2018>>> dotproduct([1,2,3], [4,5,6])
201932
2020
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002021>>> list(grouper(3, 'abcdefg', 'x'))
2022[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
2023
2024>>> list(roundrobin('abc', 'd', 'ef'))
2025['a', 'd', 'e', 'b', 'f', 'c']
2026
Raymond Hettingerace67332009-01-26 02:23:50 +00002027>>> list(powerset([1,2,3]))
2028[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002029
Raymond Hettinger191e8502009-01-27 13:29:43 +00002030>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
2031True
2032
2033>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
2034True
2035
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002036>>> list(unique_everseen('AAAABBBCCDAABBB'))
2037['A', 'B', 'C', 'D']
2038
2039>>> list(unique_everseen('ABBCcAD', str.lower))
2040['A', 'B', 'C', 'D']
2041
2042>>> list(unique_justseen('AAAABBBCCDAABBB'))
2043['A', 'B', 'C', 'D', 'A', 'B']
2044
2045>>> list(unique_justseen('ABBCcAD', str.lower))
2046['A', 'B', 'C', 'A', 'D']
2047
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002048"""
2049
2050__test__ = {'libreftest' : libreftest}
2051
2052def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002053 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00002054 RegressionTests, LengthTransparency,
Serhiy Storchaka278d03b2013-04-06 22:52:34 +03002055 SubclassWithKwargsTest, TestExamples)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002056 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002057
2058 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002059 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00002060 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002061 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002062 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002063 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00002064 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002065 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002066 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002067
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002068 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002069 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002070
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002071if __name__ == "__main__":
2072 test_main(verbose=True)