blob: 21f1bdeb82c4d14b4fee6f8a011948d195e32bb8 [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
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +020013import sys
14import struct
Benjamin Petersonee8712c2008-05-20 21:35:26 +000015maxsize = support.MAX_Py_ssize_t
Guido van Rossum360e4b82007-05-14 22:51:27 +000016minsize = -maxsize-1
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000017
Guido van Rossum801f0d72006-08-24 19:48:10 +000018def lzip(*args):
19 return list(zip(*args))
20
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000021def onearg(x):
22 'Test function of one argument'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000023 return 2*x
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000024
25def errfunc(*args):
26 'Test function that raises an error'
27 raise ValueError
28
29def gen3():
30 'Non-restartable source sequence'
31 for i in (0, 1, 2):
32 yield i
33
34def isEven(x):
35 'Test predicate'
36 return x%2==0
37
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000038def isOdd(x):
39 'Test predicate'
40 return x%2==1
41
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000042def tupleize(*args):
43 return args
44
45def irange(n):
46 for i in range(n):
47 yield i
48
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000049class StopNow:
50 'Class emulating an empty iterable.'
51 def __iter__(self):
52 return self
Georg Brandla18af4e2007-04-21 15:47:16 +000053 def __next__(self):
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +000054 raise StopIteration
Raymond Hettinger96ef8112003-02-01 00:10:11 +000055
Raymond Hettinger02420702003-06-29 20:36:23 +000056def take(n, seq):
57 'Convenience function for partially consuming a long of infinite iterable'
58 return list(islice(seq, n))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +000059
Christian Heimes78644762008-03-04 23:39:23 +000060def prod(iterable):
61 return reduce(operator.mul, iterable, 1)
62
Christian Heimes380f7f22008-02-28 11:19:05 +000063def fact(n):
64 'Factorial'
Christian Heimes78644762008-03-04 23:39:23 +000065 return prod(range(1, n+1))
66
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000067# root level methods for pickling ability
68def testR(r):
69 return r[0]
70
71def testR2(r):
72 return r[2]
73
74def underten(x):
75 return x<10
76
Raymond Hettinger96ef8112003-02-01 00:10:11 +000077class TestBasicOps(unittest.TestCase):
Raymond Hettinger482ba772010-12-01 22:48:00 +000078
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000079 def pickletest(self, it, stop=4, take=1, compare=None):
80 """Test that an iterator is the same after pickling, also when part-consumed"""
81 def expand(it, i=0):
82 # Recursively expand iterables, within sensible bounds
83 if i > 10:
84 raise RuntimeError("infinite recursion encountered")
85 if isinstance(it, str):
86 return it
87 try:
88 l = list(islice(it, stop))
89 except TypeError:
90 return it # can't expand it
91 return [expand(e, i+1) for e in l]
92
93 # Test the initial copy against the original
94 dump = pickle.dumps(it)
95 i2 = pickle.loads(dump)
96 self.assertEqual(type(it), type(i2))
97 a, b = expand(it), expand(i2)
98 self.assertEqual(a, b)
99 if compare:
100 c = expand(compare)
101 self.assertEqual(a, c)
102
103 # Take from the copy, and create another copy and compare them.
104 i3 = pickle.loads(dump)
105 took = 0
106 try:
107 for i in range(take):
108 next(i3)
109 took += 1
110 except StopIteration:
111 pass #in case there is less data than 'take'
112 dump = pickle.dumps(i3)
113 i4 = pickle.loads(dump)
114 a, b = expand(i3), expand(i4)
115 self.assertEqual(a, b)
116 if compare:
117 c = expand(compare[took:])
118 self.assertEqual(a, c);
119
Raymond Hettinger482ba772010-12-01 22:48:00 +0000120 def test_accumulate(self):
121 self.assertEqual(list(accumulate(range(10))), # one positional arg
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000122 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
123 self.assertEqual(list(accumulate(iterable=range(10))), # kw arg
124 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Raymond Hettinger482ba772010-12-01 22:48:00 +0000125 for typ in int, complex, Decimal, Fraction: # multiple types
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000126 self.assertEqual(
127 list(accumulate(map(typ, range(10)))),
Raymond Hettinger482ba772010-12-01 22:48:00 +0000128 list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])))
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +0000129 self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
Raymond Hettinger482ba772010-12-01 22:48:00 +0000130 self.assertEqual(list(accumulate([])), []) # empty iterable
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000131 self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
Raymond Hettinger5d446132011-03-27 18:52:10 -0700132 self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
Raymond Hettinger482ba772010-12-01 22:48:00 +0000133 self.assertRaises(TypeError, accumulate) # too few args
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000134 self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
Raymond Hettinger482ba772010-12-01 22:48:00 +0000135 self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
136
Raymond Hettinger5d446132011-03-27 18:52:10 -0700137 s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
138 self.assertEqual(list(accumulate(s, min)),
139 [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
140 self.assertEqual(list(accumulate(s, max)),
141 [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
142 self.assertEqual(list(accumulate(s, operator.mul)),
143 [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
144 with self.assertRaises(TypeError):
145 list(accumulate(s, chr)) # unary-operation
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000146 self.pickletest(accumulate(range(10))) # test pickling
Raymond Hettinger5d446132011-03-27 18:52:10 -0700147
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000148 def test_chain(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000149
150 def chain2(*iterables):
151 'Pure python version in the docs'
152 for it in iterables:
153 for element in it:
154 yield element
155
156 for c in (chain, chain2):
157 self.assertEqual(list(c('abc', 'def')), list('abcdef'))
158 self.assertEqual(list(c('abc')), list('abc'))
159 self.assertEqual(list(c('')), [])
160 self.assertEqual(take(4, c('abc', 'def')), list('abcd'))
161 self.assertRaises(TypeError, list,c(2, 3))
Christian Heimesf16baeb2008-02-29 14:57:44 +0000162
163 def test_chain_from_iterable(self):
164 self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
165 self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
166 self.assertEqual(list(chain.from_iterable([''])), [])
167 self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
168 self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000169
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000170 def test_chain_reducible(self):
171 operators = [copy.deepcopy,
172 lambda s: pickle.loads(pickle.dumps(s))]
173 for oper in operators:
174 it = chain('abc', 'def')
175 self.assertEqual(list(oper(it)), list('abcdef'))
176 self.assertEqual(next(it), 'a')
177 self.assertEqual(list(oper(it)), list('bcdef'))
178
179 self.assertEqual(list(oper(chain(''))), [])
180 self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
181 self.assertRaises(TypeError, list, oper(chain(2, 3)))
182 self.pickletest(chain('abc', 'def'), compare=list('abcdef'))
183
Christian Heimes380f7f22008-02-28 11:19:05 +0000184 def test_combinations(self):
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000185 self.assertRaises(TypeError, combinations, 'abc') # missing r argument
Christian Heimes380f7f22008-02-28 11:19:05 +0000186 self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
Christian Heimes78644762008-03-04 23:39:23 +0000187 self.assertRaises(TypeError, combinations, None) # pool is not iterable
Christian Heimes380f7f22008-02-28 11:19:05 +0000188 self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000189
190 for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
191 self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
192
193 self.assertEqual(list(op(combinations('ABCD', 2))),
194 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
195 testIntermediate = combinations('ABCD', 2)
196 next(testIntermediate)
197 self.assertEqual(list(op(testIntermediate)),
198 [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
199
200 self.assertEqual(list(op(combinations(range(4), 3))),
201 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
202 testIntermediate = combinations(range(4), 3)
203 next(testIntermediate)
204 self.assertEqual(list(op(testIntermediate)),
205 [(0,1,3), (0,2,3), (1,2,3)])
206
Christian Heimes78644762008-03-04 23:39:23 +0000207
208 def combinations1(iterable, r):
209 'Pure python version shown in the docs'
210 pool = tuple(iterable)
211 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000212 if r > n:
213 return
Christian Heimes78644762008-03-04 23:39:23 +0000214 indices = list(range(r))
215 yield tuple(pool[i] for i in indices)
216 while 1:
217 for i in reversed(range(r)):
218 if indices[i] != i + n - r:
219 break
220 else:
221 return
222 indices[i] += 1
223 for j in range(i+1, r):
224 indices[j] = indices[j-1] + 1
225 yield tuple(pool[i] for i in indices)
226
227 def combinations2(iterable, r):
228 'Pure python version shown in the docs'
229 pool = tuple(iterable)
230 n = len(pool)
231 for indices in permutations(range(n), r):
232 if sorted(indices) == list(indices):
233 yield tuple(pool[i] for i in indices)
234
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000235 def combinations3(iterable, r):
236 'Pure python version from cwr()'
237 pool = tuple(iterable)
238 n = len(pool)
239 for indices in combinations_with_replacement(range(n), r):
240 if len(set(indices)) == r:
241 yield tuple(pool[i] for i in indices)
242
Christian Heimes78644762008-03-04 23:39:23 +0000243 for n in range(7):
Christian Heimes380f7f22008-02-28 11:19:05 +0000244 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000245 for r in range(n+2):
Christian Heimes380f7f22008-02-28 11:19:05 +0000246 result = list(combinations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000247 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 +0000248 self.assertEqual(len(result), len(set(result))) # no repeats
249 self.assertEqual(result, sorted(result)) # lexicographic order
250 for c in result:
251 self.assertEqual(len(c), r) # r-length combinations
252 self.assertEqual(len(set(c)), r) # no duplicate elements
253 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000254 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000255 self.assertEqual(list(c),
256 [e for e in values if e in c]) # comb is a subsequence of the input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000257 self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000258 self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000259 self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000260
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000261 self.pickletest(combinations(values, r)) # test pickling
262
263 # Test implementation detail: tuple re-use
Alex Gaynore151d212011-07-17 16:21:30 -0700264 @support.impl_detail("tuple reuse is specific to CPython")
265 def test_combinations_tuple_reuse(self):
Christian Heimes78644762008-03-04 23:39:23 +0000266 self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
267 self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
268
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000269 def test_combinations_with_replacement(self):
270 cwr = combinations_with_replacement
271 self.assertRaises(TypeError, cwr, 'abc') # missing r argument
272 self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
273 self.assertRaises(TypeError, cwr, None) # pool is not iterable
274 self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000275
276 for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
277 self.assertEqual(list(op(cwr('ABC', 2))),
278 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
279 testIntermediate = cwr('ABC', 2)
280 next(testIntermediate)
281 self.assertEqual(list(op(testIntermediate)),
282 [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
283
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000284
285 def cwr1(iterable, r):
286 'Pure python version shown in the docs'
287 # number items returned: (n+r-1)! / r! / (n-1)! when n>0
288 pool = tuple(iterable)
289 n = len(pool)
290 if not n and r:
291 return
292 indices = [0] * r
293 yield tuple(pool[i] for i in indices)
294 while 1:
295 for i in reversed(range(r)):
296 if indices[i] != n - 1:
297 break
298 else:
299 return
300 indices[i:] = [indices[i] + 1] * (r - i)
301 yield tuple(pool[i] for i in indices)
302
303 def cwr2(iterable, r):
304 'Pure python version shown in the docs'
305 pool = tuple(iterable)
306 n = len(pool)
307 for indices in product(range(n), repeat=r):
308 if sorted(indices) == list(indices):
309 yield tuple(pool[i] for i in indices)
310
311 def numcombs(n, r):
312 if not n:
313 return 0 if r else 1
314 return fact(n+r-1) / fact(r)/ fact(n-1)
315
316 for n in range(7):
317 values = [5*x-12 for x in range(n)]
318 for r in range(n+2):
319 result = list(cwr(values, r))
320
321 self.assertEqual(len(result), numcombs(n, r)) # right number of combs
322 self.assertEqual(len(result), len(set(result))) # no repeats
323 self.assertEqual(result, sorted(result)) # lexicographic order
324
325 regular_combs = list(combinations(values, r)) # compare to combs without replacement
326 if n == 0 or r <= 1:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000327 self.assertEqual(result, regular_combs) # cases that should be identical
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000328 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000329 self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000330
331 for c in result:
332 self.assertEqual(len(c), r) # r-length combinations
333 noruns = [k for k,v in groupby(c)] # combo without consecutive repeats
334 self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive
335 self.assertEqual(list(c), sorted(c)) # keep original ordering
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000336 self.assertTrue(all(e in values for e in c)) # elements taken from input iterable
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000337 self.assertEqual(noruns,
338 [e for e in values if e in c]) # comb is a subsequence of the input iterable
339 self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
340 self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
341
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000342 self.pickletest(cwr(values,r)) # test pickling
343
344 # Test implementation detail: tuple re-use
345
Alex Gaynore151d212011-07-17 16:21:30 -0700346 @support.impl_detail("tuple reuse is specific to CPython")
347 def test_combinations_with_replacement_tuple_reuse(self):
348 cwr = combinations_with_replacement
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000349 self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
350 self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
351
Christian Heimes78644762008-03-04 23:39:23 +0000352 def test_permutations(self):
353 self.assertRaises(TypeError, permutations) # too few arguments
354 self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000355 self.assertRaises(TypeError, permutations, None) # pool is not iterable
356 self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000357 self.assertEqual(list(permutations('abc', 32)), []) # r > n
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000358 self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None
Christian Heimes78644762008-03-04 23:39:23 +0000359 self.assertEqual(list(permutations(range(3), 2)),
360 [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)])
361
362 def permutations1(iterable, r=None):
363 'Pure python version shown in the docs'
364 pool = tuple(iterable)
365 n = len(pool)
366 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000367 if r > n:
368 return
Christian Heimes78644762008-03-04 23:39:23 +0000369 indices = list(range(n))
370 cycles = list(range(n-r+1, n+1))[::-1]
371 yield tuple(pool[i] for i in indices[:r])
372 while n:
373 for i in reversed(range(r)):
374 cycles[i] -= 1
375 if cycles[i] == 0:
376 indices[i:] = indices[i+1:] + indices[i:i+1]
377 cycles[i] = n - i
378 else:
379 j = cycles[i]
380 indices[i], indices[-j] = indices[-j], indices[i]
381 yield tuple(pool[i] for i in indices[:r])
382 break
383 else:
384 return
385
386 def permutations2(iterable, r=None):
387 'Pure python version shown in the docs'
388 pool = tuple(iterable)
389 n = len(pool)
390 r = n if r is None else r
391 for indices in product(range(n), repeat=r):
392 if len(set(indices)) == r:
393 yield tuple(pool[i] for i in indices)
394
395 for n in range(7):
396 values = [5*x-12 for x in range(n)]
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000397 for r in range(n+2):
Christian Heimes78644762008-03-04 23:39:23 +0000398 result = list(permutations(values, r))
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000399 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 +0000400 self.assertEqual(len(result), len(set(result))) # no repeats
401 self.assertEqual(result, sorted(result)) # lexicographic order
402 for p in result:
403 self.assertEqual(len(p), r) # r-length permutations
404 self.assertEqual(len(set(p)), r) # no duplicate elements
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000405 self.assertTrue(all(e in values for e in p)) # elements taken from input iterable
Christian Heimes78644762008-03-04 23:39:23 +0000406 self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000407 self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version
Christian Heimes78644762008-03-04 23:39:23 +0000408 if r == n:
409 self.assertEqual(result, list(permutations(values, None))) # test r as None
410 self.assertEqual(result, list(permutations(values))) # test default r
411
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000412 self.pickletest(permutations(values, r)) # test pickling
413
Alex Gaynore151d212011-07-17 16:21:30 -0700414 @support.impl_detail("tuple resuse is CPython specific")
415 def test_permutations_tuple_reuse(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000416 self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
Christian Heimes78644762008-03-04 23:39:23 +0000417 self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
Christian Heimes380f7f22008-02-28 11:19:05 +0000418
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000419 def test_combinatorics(self):
420 # Test relationships between product(), permutations(),
421 # combinations() and combinations_with_replacement().
422
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000423 for n in range(6):
424 s = 'ABCDEFG'[:n]
425 for r in range(8):
426 prod = list(product(s, repeat=r))
427 cwr = list(combinations_with_replacement(s, r))
428 perm = list(permutations(s, r))
429 comb = list(combinations(s, r))
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000430
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000431 # Check size
Ezio Melottib3aedd42010-11-20 19:04:17 +0000432 self.assertEqual(len(prod), n**r)
433 self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r))
434 self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r))
435 self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000436
437 # Check lexicographic order without repeated tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000438 self.assertEqual(prod, sorted(set(prod)))
439 self.assertEqual(cwr, sorted(set(cwr)))
440 self.assertEqual(perm, sorted(set(perm)))
441 self.assertEqual(comb, sorted(set(comb)))
Raymond Hettingerda6bc522009-01-27 10:39:42 +0000442
443 # Check interrelationships
Ezio Melottib3aedd42010-11-20 19:04:17 +0000444 self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted
445 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 +0000446 self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted
447 self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups
448 self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr
449 self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm
450 self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm
Raymond Hettingereb508ad2009-01-27 09:35:21 +0000451
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000452 def test_compress(self):
Raymond Hettinger15a49502009-02-19 02:17:09 +0000453 self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF'))
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000454 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
455 self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list(''))
456 self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF'))
457 self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC'))
458 self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC'))
459 n = 10000
460 data = chain.from_iterable(repeat(range(6), n))
461 selectors = chain.from_iterable(repeat((0, 1)))
462 self.assertEqual(list(compress(data, selectors)), [1,3,5] * n)
463 self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable
464 self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable
465 self.assertRaises(TypeError, compress, range(6)) # too few args
466 self.assertRaises(TypeError, compress, range(6), None) # too many args
467
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000468 # check copy, deepcopy, pickle
469 for op in (lambda a:copy.copy(a), lambda a:copy.deepcopy(a), lambda a:pickle.loads(pickle.dumps(a))):
470 for data, selectors, result1, result2 in [
471 ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
472 ('ABCDEF', [0,0,0,0,0,0], '', ''),
473 ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
474 ('ABCDEF', [1,0,1], 'AC', 'C'),
475 ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
476 ]:
477
478 self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
479 self.assertEqual(list(op(compress(data, selectors))), list(result1))
480 testIntermediate = compress(data, selectors)
481 if result1:
482 next(testIntermediate)
483 self.assertEqual(list(op(testIntermediate)), list(result2))
484
485
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000486 def test_count(self):
Guido van Rossum801f0d72006-08-24 19:48:10 +0000487 self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
488 self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
489 self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)])
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000490 self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)])
491 self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000492 self.assertRaises(TypeError, count, 2, 3, 4)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000493 self.assertRaises(TypeError, count, 'a')
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000494 self.assertEqual(list(islice(count(maxsize-5), 10)),
495 list(range(maxsize-5, maxsize+5)))
496 self.assertEqual(list(islice(count(-maxsize-5), 10)),
497 list(range(-maxsize-5, -maxsize+5)))
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000498 self.assertEqual(list(islice(count(10, maxsize+5), 3)),
499 list(range(10, 10+3*(maxsize+5), maxsize+5)))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000500 c = count(3)
501 self.assertEqual(repr(c), 'count(3)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000502 next(c)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000503 self.assertEqual(repr(c), 'count(4)')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000504 c = count(-9)
505 self.assertEqual(repr(c), 'count(-9)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000506 next(c)
Raymond Hettinger30729212009-02-12 06:28:27 +0000507 self.assertEqual(repr(count(10.25)), 'count(10.25)')
Georg Brandla18af4e2007-04-21 15:47:16 +0000508 self.assertEqual(next(c), -8)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000509 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 +0300510 # Test repr
511 r1 = repr(count(i))
512 r2 = 'count(%r)'.__mod__(i)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000513 self.assertEqual(r1, r2)
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000514
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000515 # check copy, deepcopy, pickle
516 for value in -3, 3, maxsize-5, maxsize+5:
517 c = count(value)
518 self.assertEqual(next(copy.copy(c)), value)
519 self.assertEqual(next(copy.deepcopy(c)), value)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000520 self.pickletest(count(value))
Raymond Hettingera3e1ad22009-11-30 22:02:31 +0000521
Kristjan Valur Jonsson35722a92011-03-30 11:04:28 +0000522 #check proper internal error handling for large "step' sizes
523 count(1, maxsize+5); sys.exc_info()
524
Raymond Hettinger30729212009-02-12 06:28:27 +0000525 def test_count_with_stride(self):
526 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettingereb13fdd2009-02-21 22:30:12 +0000527 self.assertEqual(lzip('abc',count(start=2,step=3)),
528 [('a', 2), ('b', 5), ('c', 8)])
529 self.assertEqual(lzip('abc',count(step=-1)),
530 [('a', 0), ('b', -1), ('c', -2)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000531 self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)])
532 self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)])
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000533 self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000534 self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3)))
535 self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3)))
536 self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j])
Raymond Hettinger8a882a72009-02-12 12:08:18 +0000537 self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))),
538 [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')])
Raymond Hettingerde09acf2009-02-12 12:53:53 +0000539 self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))),
540 [Fraction(2,3), Fraction(17,21), Fraction(20,21)])
Raymond Hettinger30729212009-02-12 06:28:27 +0000541 self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0]))
542 c = count(3, 5)
543 self.assertEqual(repr(c), 'count(3, 5)')
544 next(c)
545 self.assertEqual(repr(c), 'count(8, 5)')
546 c = count(-9, 0)
547 self.assertEqual(repr(c), 'count(-9, 0)')
548 next(c)
549 self.assertEqual(repr(c), 'count(-9, 0)')
550 c = count(-9, -3)
551 self.assertEqual(repr(c), 'count(-9, -3)')
552 next(c)
553 self.assertEqual(repr(c), 'count(-12, -3)')
554 self.assertEqual(repr(c), 'count(-12, -3)')
555 self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)')
556 self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int
557 self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0
558 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
559 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 +0300560 # Test repr
561 r1 = repr(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000562 if j == 1:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300563 r2 = ('count(%r)' % i)
Raymond Hettinger30729212009-02-12 06:28:27 +0000564 else:
Serhiy Storchaka95949422013-08-27 19:40:23 +0300565 r2 = ('count(%r, %r)' % (i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000566 self.assertEqual(r1, r2)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000567 self.pickletest(count(i, j))
Raymond Hettinger30729212009-02-12 06:28:27 +0000568
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000569 def test_cycle(self):
Raymond Hettinger02420702003-06-29 20:36:23 +0000570 self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000571 self.assertEqual(list(cycle('')), [])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000572 self.assertRaises(TypeError, cycle)
573 self.assertRaises(TypeError, cycle, 5)
574 self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000575
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000576 # check copy, deepcopy, pickle
577 c = cycle('abc')
578 self.assertEqual(next(c), 'a')
579 #simple copy currently not supported, because __reduce__ returns
580 #an internal iterator
581 #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
582 self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
583 self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('bcabcabcab'))
584 next(c)
585 self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('cabcabcabc'))
586 self.pickletest(cycle('abc'))
587
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000588 def test_groupby(self):
589 # Check whether it accepts arguments correctly
590 self.assertEqual([], list(groupby([])))
591 self.assertEqual([], list(groupby([], key=id)))
592 self.assertRaises(TypeError, list, groupby('abc', []))
593 self.assertRaises(TypeError, groupby, None)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000594 self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10)
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000595
596 # Check normal input
597 s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22),
598 (2,15,22), (3,16,23), (3,17,23)]
599 dup = []
600 for k, g in groupby(s, lambda r:r[0]):
601 for elem in g:
602 self.assertEqual(k, elem[0])
603 dup.append(elem)
604 self.assertEqual(s, dup)
605
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000606 # Check normal pickled
607 dup = []
608 for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
609 for elem in g:
610 self.assertEqual(k, elem[0])
611 dup.append(elem)
612 self.assertEqual(s, dup)
613
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000614 # Check nested case
615 dup = []
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000616 for k, g in groupby(s, testR):
617 for ik, ig in groupby(g, testR2):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000618 for elem in ig:
619 self.assertEqual(k, elem[0])
620 self.assertEqual(ik, elem[2])
621 dup.append(elem)
622 self.assertEqual(s, dup)
623
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000624 # Check nested and pickled
625 dup = []
626 for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
627 for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2))):
628 for elem in ig:
629 self.assertEqual(k, elem[0])
630 self.assertEqual(ik, elem[2])
631 dup.append(elem)
632 self.assertEqual(s, dup)
633
634
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000635 # Check case where inner iterator is not used
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000636 keys = [k for k, g in groupby(s, testR)]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000637 expectedkeys = set([r[0] for r in s])
638 self.assertEqual(set(keys), expectedkeys)
639 self.assertEqual(len(keys), len(expectedkeys))
640
641 # Exercise pipes and filters style
642 s = 'abracadabra'
643 # sort s | uniq
Raymond Hettinger64958a12003-12-17 20:43:33 +0000644 r = [k for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000645 self.assertEqual(r, ['a', 'b', 'c', 'd', 'r'])
646 # sort s | uniq -d
Raymond Hettinger64958a12003-12-17 20:43:33 +0000647 r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000648 self.assertEqual(r, ['a', 'b', 'r'])
649 # sort s | uniq -c
Raymond Hettinger64958a12003-12-17 20:43:33 +0000650 r = [(len(list(g)), k) for k, g in groupby(sorted(s))]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000651 self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')])
652 # sort s | uniq -c | sort -rn | head -3
Raymond Hettinger64958a12003-12-17 20:43:33 +0000653 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3]
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000654 self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')])
655
Georg Brandla18af4e2007-04-21 15:47:16 +0000656 # iter.__next__ failure
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000657 class ExpectedError(Exception):
658 pass
659 def delayed_raise(n=0):
660 for i in range(n):
661 yield 'yo'
662 raise ExpectedError
663 def gulp(iterable, keyp=None, func=list):
664 return [func(g) for k, g in groupby(iterable, keyp)]
665
Georg Brandla18af4e2007-04-21 15:47:16 +0000666 # iter.__next__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000667 self.assertRaises(ExpectedError, gulp, delayed_raise(0))
Georg Brandla18af4e2007-04-21 15:47:16 +0000668 # iter.__next__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000669 self.assertRaises(ExpectedError, gulp, delayed_raise(1))
670
671 # __cmp__ failure
672 class DummyCmp:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000673 def __eq__(self, dst):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000674 raise ExpectedError
675 s = [DummyCmp(), DummyCmp(), None]
676
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000677 # __eq__ failure on outer object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000678 self.assertRaises(ExpectedError, gulp, s, func=id)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000679 # __eq__ failure on inner object
Raymond Hettingerd25c1c62003-12-06 16:23:06 +0000680 self.assertRaises(ExpectedError, gulp, s)
681
682 # keyfunc failure
683 def keyfunc(obj):
684 if keyfunc.skip > 0:
685 keyfunc.skip -= 1
686 return obj
687 else:
688 raise ExpectedError
689
690 # keyfunc failure on outer object
691 keyfunc.skip = 0
692 self.assertRaises(ExpectedError, gulp, [None], keyfunc)
693 keyfunc.skip = 1
694 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
695
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000696 def test_filter(self):
697 self.assertEqual(list(filter(isEven, range(6))), [0,2,4])
698 self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2])
699 self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2])
700 self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6])
701 self.assertRaises(TypeError, filter)
702 self.assertRaises(TypeError, filter, lambda x:x)
703 self.assertRaises(TypeError, filter, lambda x:x, range(6), 7)
704 self.assertRaises(TypeError, filter, isEven, 3)
705 self.assertRaises(TypeError, next, filter(range(6), range(6)))
Raymond Hettinger60eca932003-02-09 06:40:58 +0000706
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000707 # check copy, deepcopy, pickle
708 ans = [0,2,4]
709
710 c = filter(isEven, range(6))
711 self.assertEqual(list(copy.copy(c)), ans)
712 c = filter(isEven, range(6))
713 self.assertEqual(list(copy.deepcopy(c)), ans)
714 c = filter(isEven, range(6))
715 self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans)
716 next(c)
717 self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans[1:])
718 c = filter(isEven, range(6))
719 self.pickletest(c)
720
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000721 def test_filterfalse(self):
722 self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
723 self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
724 self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0])
725 self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7])
726 self.assertRaises(TypeError, filterfalse)
727 self.assertRaises(TypeError, filterfalse, lambda x:x)
728 self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
729 self.assertRaises(TypeError, filterfalse, isEven, 3)
730 self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000731 self.pickletest(filterfalse(isEven, range(6)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000732
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000733 def test_zip(self):
734 # XXX This is rather silly now that builtin zip() calls zip()...
735 ans = [(x,y) for x, y in zip('abc',count())]
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000736 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000737 self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6)))
738 self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3)))
739 self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3)))
740 self.assertEqual(list(zip('abcdef')), lzip('abcdef'))
741 self.assertEqual(list(zip()), lzip())
742 self.assertRaises(TypeError, zip, 3)
743 self.assertRaises(TypeError, zip, range(3), 3)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000744 self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000745 lzip('abc', 'def'))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000746 self.assertEqual([pair for pair in zip('abc', 'def')],
Guido van Rossum801f0d72006-08-24 19:48:10 +0000747 lzip('abc', 'def'))
Alex Gaynore151d212011-07-17 16:21:30 -0700748
749 @support.impl_detail("tuple reuse is specific to CPython")
750 def test_zip_tuple_reuse(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000751 ids = list(map(id, zip('abc', 'def')))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000752 self.assertEqual(min(ids), max(ids))
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000753 ids = list(map(id, list(zip('abc', 'def'))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +0000754 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000755
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000756 # check copy, deepcopy, pickle
757 ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
758 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
759
760 ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
761 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
762
763 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count())))]
764 self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
765
766 testIntermediate = zip('abc',count())
767 next(testIntermediate)
768 ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate))]
769 self.assertEqual(ans, [('b', 1), ('c', 2)])
770
771 self.pickletest(zip('abc', count()))
772
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000773 def test_ziplongest(self):
Thomas Wouterscf297e42007-02-23 15:07:44 +0000774 for args in [
775 ['abc', range(6)],
776 [range(6), 'abc'],
777 [range(1000), range(2000,2100), range(3000,3050)],
778 [range(1000), range(0), range(3000,3050), range(1200), range(1500)],
779 [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)],
780 ]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000781 target = [tuple([arg[i] if i < len(arg) else None for arg in args])
782 for i in range(max(map(len, args)))]
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000783 self.assertEqual(list(zip_longest(*args)), target)
784 self.assertEqual(list(zip_longest(*args, **{})), target)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000785 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 +0000786 self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000787
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000788 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 +0000789
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000790 self.assertEqual(list(zip_longest()), list(zip()))
791 self.assertEqual(list(zip_longest([])), list(zip([])))
792 self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef')))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000793
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000794 self.assertEqual(list(zip_longest('abc', 'defg', **{})),
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000795 list(zip(list('abc')+[None], 'defg'))) # empty keyword dict
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000796 self.assertRaises(TypeError, zip_longest, 3)
797 self.assertRaises(TypeError, zip_longest, range(3), 3)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000798
799 for stmt in [
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000800 "zip_longest('abc', fv=1)",
801 "zip_longest('abc', fillvalue=1, bogus_keyword=None)",
Thomas Wouterscf297e42007-02-23 15:07:44 +0000802 ]:
803 try:
804 eval(stmt, globals(), locals())
805 except TypeError:
806 pass
807 else:
808 self.fail('Did not raise Type in: ' + stmt)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000809
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000810 self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000811 list(zip('abc', 'def')))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000812 self.assertEqual([pair for pair in zip_longest('abc', 'def')],
Thomas Wouterscf297e42007-02-23 15:07:44 +0000813 list(zip('abc', 'def')))
Alex Gaynore151d212011-07-17 16:21:30 -0700814
815 @support.impl_detail("tuple reuse is specific to CPython")
816 def test_zip_longest_tuple_reuse(self):
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000817 ids = list(map(id, zip_longest('abc', 'def')))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000818 self.assertEqual(min(ids), max(ids))
Raymond Hettingerb0002d22008-03-13 01:41:43 +0000819 ids = list(map(id, list(zip_longest('abc', 'def'))))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000820 self.assertEqual(len(dict.fromkeys(ids)), len(ids))
821
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000822 def test_zip_longest_pickling(self):
823 self.pickletest(zip_longest("abc", "def"))
824 self.pickletest(zip_longest("abc", "defgh"))
825 self.pickletest(zip_longest("abc", "defgh", fillvalue=1))
826 self.pickletest(zip_longest("", "defgh"))
827
Raymond Hettingerfc438512009-11-01 20:55:33 +0000828 def test_bug_7244(self):
829
830 class Repeater:
831 # this class is similar to itertools.repeat
832 def __init__(self, o, t, e):
833 self.o = o
834 self.t = int(t)
835 self.e = e
836 def __iter__(self): # its iterator is itself
837 return self
838 def __next__(self):
839 if self.t > 0:
840 self.t -= 1
841 return self.o
842 else:
843 raise self.e
844
845 # Formerly this code in would fail in debug mode
846 # with Undetected Error and Stop Iteration
847 r1 = Repeater(1, 3, StopIteration)
848 r2 = Repeater(2, 4, StopIteration)
849 def run(r1, r2):
850 result = []
851 for i, j in zip_longest(r1, r2, fillvalue=0):
852 with support.captured_output('stdout'):
853 print((i, j))
854 result.append((i, j))
855 return result
856 self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)])
857
858 # Formerly, the RuntimeError would be lost
859 # and StopIteration would stop as expected
860 r1 = Repeater(1, 3, RuntimeError)
861 r2 = Repeater(2, 4, StopIteration)
862 it = zip_longest(r1, r2, fillvalue=0)
863 self.assertEqual(next(it), (1, 2))
864 self.assertEqual(next(it), (1, 2))
865 self.assertEqual(next(it), (1, 2))
866 self.assertRaises(RuntimeError, next, it)
867
Christian Heimesc3f30c42008-02-22 16:37:40 +0000868 def test_product(self):
869 for args, result in [
Christian Heimes78644762008-03-04 23:39:23 +0000870 ([], [()]), # zero iterables
Christian Heimesc3f30c42008-02-22 16:37:40 +0000871 (['ab'], [('a',), ('b',)]), # one iterable
872 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
873 ([range(0), range(2), range(3)], []), # first iterable with zero length
874 ([range(2), range(0), range(3)], []), # middle iterable with zero length
875 ([range(2), range(3), range(0)], []), # last iterable with zero length
876 ]:
877 self.assertEqual(list(product(*args)), result)
Christian Heimesf16baeb2008-02-29 14:57:44 +0000878 for r in range(4):
879 self.assertEqual(list(product(*(args*r))),
880 list(product(*args, **dict(repeat=r))))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000881 self.assertEqual(len(list(product(*[range(7)]*6))), 7**6)
882 self.assertRaises(TypeError, product, range(6), None)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000883
884 def product1(*args, **kwds):
885 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
886 n = len(pools)
887 if n == 0:
888 yield ()
889 return
890 if any(len(pool) == 0 for pool in pools):
891 return
892 indices = [0] * n
893 yield tuple(pool[i] for pool, i in zip(pools, indices))
894 while 1:
895 for i in reversed(range(n)): # right to left
896 if indices[i] == len(pools[i]) - 1:
897 continue
898 indices[i] += 1
899 for j in range(i+1, n):
900 indices[j] = 0
901 yield tuple(pool[i] for pool, i in zip(pools, indices))
902 break
903 else:
904 return
905
906 def product2(*args, **kwds):
907 'Pure python version used in docs'
908 pools = list(map(tuple, args)) * kwds.get('repeat', 1)
909 result = [[]]
910 for pool in pools:
911 result = [x+[y] for x in result for y in pool]
912 for prod in result:
913 yield tuple(prod)
914
Christian Heimesc3f30c42008-02-22 16:37:40 +0000915 argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3),
916 set('abcdefg'), range(11), tuple(range(13))]
917 for i in range(100):
918 args = [random.choice(argtypes) for j in range(random.randrange(5))]
Christian Heimes78644762008-03-04 23:39:23 +0000919 expected_len = prod(map(len, args))
920 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000921 self.assertEqual(list(product(*args)), list(product1(*args)))
922 self.assertEqual(list(product(*args)), list(product2(*args)))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000923 args = map(iter, args)
Christian Heimes78644762008-03-04 23:39:23 +0000924 self.assertEqual(len(list(product(*args))), expected_len)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000925
Alex Gaynore151d212011-07-17 16:21:30 -0700926 @support.impl_detail("tuple reuse is specific to CPython")
927 def test_product_tuple_reuse(self):
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000928 self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
929 self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
Christian Heimesc3f30c42008-02-22 16:37:40 +0000930
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000931 def test_product_pickling(self):
932 # check copy, deepcopy, pickle
933 for args, result in [
934 ([], [()]), # zero iterables
935 (['ab'], [('a',), ('b',)]), # one iterable
936 ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
937 ([range(0), range(2), range(3)], []), # first iterable with zero length
938 ([range(2), range(0), range(3)], []), # middle iterable with zero length
939 ([range(2), range(3), range(0)], []), # last iterable with zero length
940 ]:
941 self.assertEqual(list(copy.copy(product(*args))), result)
942 self.assertEqual(list(copy.deepcopy(product(*args))), result)
943 self.pickletest(product(*args))
944
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000945 def test_repeat(self):
Raymond Hettingerf4bb7f22009-02-19 02:44:01 +0000946 self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
Guido van Rossum805365e2007-05-07 22:24:25 +0000947 self.assertEqual(lzip(range(3),repeat('a')),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000948 [(0, 'a'), (1, 'a'), (2, 'a')])
Raymond Hettinger61fe64d2003-02-23 04:40:07 +0000949 self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a'])
Raymond Hettinger02420702003-06-29 20:36:23 +0000950 self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a'])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000951 self.assertEqual(list(repeat('a', 0)), [])
952 self.assertEqual(list(repeat('a', -3)), [])
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000953 self.assertRaises(TypeError, repeat)
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +0000954 self.assertRaises(TypeError, repeat, None, 3, 4)
955 self.assertRaises(TypeError, repeat, None, 'a')
Raymond Hettinger4cda01e2004-09-28 04:45:28 +0000956 r = repeat(1+0j)
957 self.assertEqual(repr(r), 'repeat((1+0j))')
958 r = repeat(1+0j, 5)
959 self.assertEqual(repr(r), 'repeat((1+0j), 5)')
960 list(r)
961 self.assertEqual(repr(r), 'repeat((1+0j), 0)')
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000962
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000963 # check copy, deepcopy, pickle
964 c = repeat(object='a', times=10)
965 self.assertEqual(next(c), 'a')
966 self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
967 self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
968 self.pickletest(repeat(object='a', times=10))
969
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000970 def test_map(self):
971 self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000972 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000973 self.assertEqual(list(map(tupleize, 'abc', range(5))),
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000974 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000975 self.assertEqual(list(map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000976 [('a',0),('b',1),('c',2)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000977 self.assertEqual(take(2,map(tupleize, 'abc', count())),
Raymond Hettinger02420702003-06-29 20:36:23 +0000978 [('a',0),('b',1)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +0000979 self.assertEqual(list(map(operator.pow, [])), [])
980 self.assertRaises(TypeError, map)
981 self.assertRaises(TypeError, list, map(None, range(3), range(3)))
982 self.assertRaises(TypeError, map, operator.neg)
983 self.assertRaises(TypeError, next, map(10, range(5)))
984 self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
985 self.assertRaises(TypeError, next, map(onearg, [4], [5]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000986
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000987 # check copy, deepcopy, pickle
988 ans = [('a',0),('b',1),('c',2)]
989
990 c = map(tupleize, 'abc', count())
991 self.assertEqual(list(copy.copy(c)), ans)
992
993 c = map(tupleize, 'abc', count())
994 self.assertEqual(list(copy.deepcopy(c)), ans)
995
996 c = map(tupleize, 'abc', count())
997 self.pickletest(c)
998
Raymond Hettinger96ef8112003-02-01 00:10:11 +0000999 def test_starmap(self):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001000 self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
1001 [0**1, 1**2, 2**3])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001002 self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))),
Raymond Hettinger02420702003-06-29 20:36:23 +00001003 [0**1, 1**2, 2**3])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001004 self.assertEqual(list(starmap(operator.pow, [])), [])
Christian Heimes679db4a2008-01-18 09:56:22 +00001005 self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
1006 self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001007 self.assertRaises(TypeError, starmap)
1008 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001009 self.assertRaises(TypeError, next, starmap(10, [(4,5)]))
1010 self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
1011 self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001012
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001013 # check copy, deepcopy, pickle
1014 ans = [0**1, 1**2, 2**3]
1015
1016 c = starmap(operator.pow, zip(range(3), range(1,7)))
1017 self.assertEqual(list(copy.copy(c)), ans)
1018
1019 c = starmap(operator.pow, zip(range(3), range(1,7)))
1020 self.assertEqual(list(copy.deepcopy(c)), ans)
1021
1022 c = starmap(operator.pow, zip(range(3), range(1,7)))
1023 self.pickletest(c)
1024
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001025 def test_islice(self):
1026 for args in [ # islice(args) should agree with range(args)
1027 (10, 20, 3),
1028 (10, 3, 20),
1029 (10, 20),
1030 (10, 3),
1031 (20,)
1032 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001033 self.assertEqual(list(islice(range(100), *args)),
1034 list(range(*args)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001035
1036 for args, tgtargs in [ # Stop when seqn is exhausted
1037 ((10, 110, 3), ((10, 100, 3))),
1038 ((10, 110), ((10, 100))),
1039 ((110,), (100,))
1040 ]:
Guido van Rossum805365e2007-05-07 22:24:25 +00001041 self.assertEqual(list(islice(range(100), *args)),
1042 list(range(*tgtargs)))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001043
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001044 # Test stop=None
Guido van Rossum805365e2007-05-07 22:24:25 +00001045 self.assertEqual(list(islice(range(10), None)), list(range(10)))
1046 self.assertEqual(list(islice(range(10), None, None)), list(range(10)))
1047 self.assertEqual(list(islice(range(10), None, None, None)), list(range(10)))
1048 self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10)))
1049 self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2)))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001050
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001051 # Test number of items consumed SF #1171417
1052 it = iter(range(10))
Guido van Rossum805365e2007-05-07 22:24:25 +00001053 self.assertEqual(list(islice(it, 3)), list(range(3)))
1054 self.assertEqual(list(it), list(range(3, 10)))
Raymond Hettingerfdf3bd62005-03-27 20:11:44 +00001055
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001056 # Test invalid arguments
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001057 ra = range(10)
1058 self.assertRaises(TypeError, islice, ra)
1059 self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
1060 self.assertRaises(ValueError, islice, ra, -5, 10, 1)
1061 self.assertRaises(ValueError, islice, ra, 1, -5, -1)
1062 self.assertRaises(ValueError, islice, ra, 1, 10, -1)
1063 self.assertRaises(ValueError, islice, ra, 1, 10, 0)
1064 self.assertRaises(ValueError, islice, ra, 'a')
1065 self.assertRaises(ValueError, islice, ra, 'a', 1)
1066 self.assertRaises(ValueError, islice, ra, 1, 'a')
1067 self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
1068 self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
Guido van Rossum360e4b82007-05-14 22:51:27 +00001069 self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001070
Raymond Hettinger69b34bf2010-11-30 02:49:29 +00001071 # Issue #10323: Less islice in a predictable state
1072 c = count()
1073 self.assertEqual(list(islice(c, 1, 3, 50)), [1])
1074 self.assertEqual(next(c), 3)
1075
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001076 # check copy, deepcopy, pickle
1077 for args in [ # islice(args) should agree with range(args)
1078 (10, 20, 3),
1079 (10, 3, 20),
1080 (10, 20),
1081 (10, 3),
1082 (20,)
1083 ]:
1084 self.assertEqual(list(copy.copy(islice(range(100), *args))),
1085 list(range(*args)))
1086 self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
1087 list(range(*args)))
1088 self.pickletest(islice(range(100), *args))
1089
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001090 def test_takewhile(self):
1091 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001092 self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001093 self.assertEqual(list(takewhile(underten, [])), [])
1094 self.assertRaises(TypeError, takewhile)
1095 self.assertRaises(TypeError, takewhile, operator.pow)
1096 self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001097 self.assertRaises(TypeError, next, takewhile(10, [(4,5)]))
1098 self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)]))
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001099 t = takewhile(bool, [1, 1, 1, 0, 0, 0])
1100 self.assertEqual(list(t), [1, 1, 1])
Georg Brandla18af4e2007-04-21 15:47:16 +00001101 self.assertRaises(StopIteration, next, t)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001102
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001103 # check copy, deepcopy, pickle
1104 self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
1105 self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
1106 [1, 3, 5])
1107 self.pickletest(takewhile(underten, data))
1108
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001109 def test_dropwhile(self):
1110 data = [1, 3, 5, 20, 2, 4, 6, 8]
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001111 self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
Raymond Hettinger7c2bb5b2003-05-03 05:59:48 +00001112 self.assertEqual(list(dropwhile(underten, [])), [])
1113 self.assertRaises(TypeError, dropwhile)
1114 self.assertRaises(TypeError, dropwhile, operator.pow)
1115 self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra')
Georg Brandla18af4e2007-04-21 15:47:16 +00001116 self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
1117 self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001118
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001119 # check copy, deepcopy, pickle
1120 self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
1121 self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
1122 [20, 2, 4, 6, 8])
1123 self.pickletest(dropwhile(underten, data))
1124
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001125 def test_tee(self):
Raymond Hettingerad983e72003-11-12 14:32:26 +00001126 n = 200
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001127
1128 a, b = tee([]) # test empty iterator
1129 self.assertEqual(list(a), [])
1130 self.assertEqual(list(b), [])
1131
1132 a, b = tee(irange(n)) # test 100% interleaved
Guido van Rossum801f0d72006-08-24 19:48:10 +00001133 self.assertEqual(lzip(a,b), lzip(range(n), range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001134
1135 a, b = tee(irange(n)) # test 0% interleaved
Guido van Rossum805365e2007-05-07 22:24:25 +00001136 self.assertEqual(list(a), list(range(n)))
1137 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001138
1139 a, b = tee(irange(n)) # test dealloc of leading iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001140 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001141 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001142 del a
Guido van Rossum805365e2007-05-07 22:24:25 +00001143 self.assertEqual(list(b), list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001144
1145 a, b = tee(irange(n)) # test dealloc of trailing iterator
Guido van Rossum805365e2007-05-07 22:24:25 +00001146 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001147 self.assertEqual(next(a), i)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001148 del b
Guido van Rossum805365e2007-05-07 22:24:25 +00001149 self.assertEqual(list(a), list(range(100, n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001150
Guido van Rossum805365e2007-05-07 22:24:25 +00001151 for j in range(5): # test randomly interleaved
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001152 order = [0]*n + [1]*n
1153 random.shuffle(order)
1154 lists = ([], [])
1155 its = tee(irange(n))
1156 for i in order:
Georg Brandla18af4e2007-04-21 15:47:16 +00001157 value = next(its[i])
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001158 lists[i].append(value)
Guido van Rossum805365e2007-05-07 22:24:25 +00001159 self.assertEqual(lists[0], list(range(n)))
1160 self.assertEqual(lists[1], list(range(n)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001161
Raymond Hettingerad983e72003-11-12 14:32:26 +00001162 # test argument format checking
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001163 self.assertRaises(TypeError, tee)
1164 self.assertRaises(TypeError, tee, 3)
1165 self.assertRaises(TypeError, tee, [1,2], 'x')
Raymond Hettingerad983e72003-11-12 14:32:26 +00001166 self.assertRaises(TypeError, tee, [1,2], 3, 'x')
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001167
Raymond Hettingerad983e72003-11-12 14:32:26 +00001168 # tee object should be instantiable
1169 a, b = tee('abc')
1170 c = type(a)('def')
1171 self.assertEqual(list(c), list('def'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001172
Raymond Hettingerad983e72003-11-12 14:32:26 +00001173 # test long-lagged and multi-way split
Guido van Rossum805365e2007-05-07 22:24:25 +00001174 a, b, c = tee(range(2000), 3)
1175 for i in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +00001176 self.assertEqual(next(a), i)
Guido van Rossum805365e2007-05-07 22:24:25 +00001177 self.assertEqual(list(b), list(range(2000)))
1178 self.assertEqual([next(c), next(c)], list(range(2)))
1179 self.assertEqual(list(a), list(range(100,2000)))
1180 self.assertEqual(list(c), list(range(2,2000)))
Raymond Hettingerad983e72003-11-12 14:32:26 +00001181
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001182 # test values of n
1183 self.assertRaises(TypeError, tee, 'abc', 'invalid')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001184 self.assertRaises(ValueError, tee, [], -1)
Guido van Rossum805365e2007-05-07 22:24:25 +00001185 for n in range(5):
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001186 result = tee('abc', n)
1187 self.assertEqual(type(result), tuple)
1188 self.assertEqual(len(result), n)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001189 self.assertEqual([list(x) for x in result], [list('abc')]*n)
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001190
Raymond Hettingerad983e72003-11-12 14:32:26 +00001191 # tee pass-through to copyable iterator
1192 a, b = tee('abc')
1193 c, d = tee(a)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001194 self.assertTrue(a is c)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001195
Raymond Hettinger4cda01e2004-09-28 04:45:28 +00001196 # test tee_new
1197 t1, t2 = tee('abc')
1198 tnew = type(t1)
1199 self.assertRaises(TypeError, tnew)
1200 self.assertRaises(TypeError, tnew, 10)
1201 t3 = tnew(t1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001202 self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc'))
Raymond Hettingerf0c5aec2003-10-26 14:25:56 +00001203
Raymond Hettingera9f60922004-10-17 16:40:14 +00001204 # test that tee objects are weak referencable
Guido van Rossum805365e2007-05-07 22:24:25 +00001205 a, b = tee(range(10))
Raymond Hettingera9f60922004-10-17 16:40:14 +00001206 p = proxy(a)
1207 self.assertEqual(getattr(p, '__class__'), type(b))
1208 del a
1209 self.assertRaises(ReferenceError, getattr, p, '__class__')
1210
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001211 ans = list('abc')
1212 long_ans = list(range(10000))
1213
1214 # check copy
1215 a, b = tee('abc')
1216 self.assertEqual(list(copy.copy(a)), ans)
1217 self.assertEqual(list(copy.copy(b)), ans)
1218 a, b = tee(list(range(10000)))
1219 self.assertEqual(list(copy.copy(a)), long_ans)
1220 self.assertEqual(list(copy.copy(b)), long_ans)
1221
1222 # check partially consumed copy
1223 a, b = tee('abc')
1224 take(2, a)
1225 take(1, b)
1226 self.assertEqual(list(copy.copy(a)), ans[2:])
1227 self.assertEqual(list(copy.copy(b)), ans[1:])
1228 self.assertEqual(list(a), ans[2:])
1229 self.assertEqual(list(b), ans[1:])
1230 a, b = tee(range(10000))
1231 take(100, a)
1232 take(60, b)
1233 self.assertEqual(list(copy.copy(a)), long_ans[100:])
1234 self.assertEqual(list(copy.copy(b)), long_ans[60:])
1235 self.assertEqual(list(a), long_ans[100:])
1236 self.assertEqual(list(b), long_ans[60:])
1237
1238 # check deepcopy
1239 a, b = tee('abc')
1240 self.assertEqual(list(copy.deepcopy(a)), ans)
1241 self.assertEqual(list(copy.deepcopy(b)), ans)
1242 self.assertEqual(list(a), ans)
1243 self.assertEqual(list(b), ans)
1244 a, b = tee(range(10000))
1245 self.assertEqual(list(copy.deepcopy(a)), long_ans)
1246 self.assertEqual(list(copy.deepcopy(b)), long_ans)
1247 self.assertEqual(list(a), long_ans)
1248 self.assertEqual(list(b), long_ans)
1249
1250 # check partially consumed deepcopy
1251 a, b = tee('abc')
1252 take(2, a)
1253 take(1, b)
1254 self.assertEqual(list(copy.deepcopy(a)), ans[2:])
1255 self.assertEqual(list(copy.deepcopy(b)), ans[1:])
1256 self.assertEqual(list(a), ans[2:])
1257 self.assertEqual(list(b), ans[1:])
1258 a, b = tee(range(10000))
1259 take(100, a)
1260 take(60, b)
1261 self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
1262 self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
1263 self.assertEqual(list(a), long_ans[100:])
1264 self.assertEqual(list(b), long_ans[60:])
1265
1266 # check pickle
1267 self.pickletest(iter(tee('abc')))
1268 a, b = tee('abc')
1269 self.pickletest(a, compare=ans)
1270 self.pickletest(b, compare=ans)
1271
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001272 # Issue 13454: Crash when deleting backward iterator from tee()
1273 def test_tee_del_backward(self):
Serhiy Storchaka5bb893c2013-01-26 11:52:06 +02001274 forward, backward = tee(repeat(None, 20000000))
1275 any(forward) # exhaust the iterator
Serhiy Storchakaa3e91282013-01-25 13:19:31 +02001276 del backward
1277
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001278 def test_StopIteration(self):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001279 self.assertRaises(StopIteration, next, zip())
Raymond Hettingerb5a42082003-08-08 05:10:41 +00001280
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001281 for f in (chain, cycle, zip, groupby):
Georg Brandla18af4e2007-04-21 15:47:16 +00001282 self.assertRaises(StopIteration, next, f([]))
1283 self.assertRaises(StopIteration, next, f(StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001284
Georg Brandla18af4e2007-04-21 15:47:16 +00001285 self.assertRaises(StopIteration, next, islice([], None))
1286 self.assertRaises(StopIteration, next, islice(StopNow(), None))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001287
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001288 p, q = tee([])
Georg Brandla18af4e2007-04-21 15:47:16 +00001289 self.assertRaises(StopIteration, next, p)
1290 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001291 p, q = tee(StopNow())
Georg Brandla18af4e2007-04-21 15:47:16 +00001292 self.assertRaises(StopIteration, next, p)
1293 self.assertRaises(StopIteration, next, q)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001294
Georg Brandla18af4e2007-04-21 15:47:16 +00001295 self.assertRaises(StopIteration, next, repeat(None, 0))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001296
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001297 for f in (filter, filterfalse, map, takewhile, dropwhile, starmap):
Georg Brandla18af4e2007-04-21 15:47:16 +00001298 self.assertRaises(StopIteration, next, f(lambda x:x, []))
1299 self.assertRaises(StopIteration, next, f(lambda x:x, StopNow()))
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001300
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001301class TestExamples(unittest.TestCase):
1302
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001303 def test_accumulate(self):
Raymond Hettinger482ba772010-12-01 22:48:00 +00001304 self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
1305
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001306 def test_accumulate_reducible(self):
1307 # check copy, deepcopy, pickle
1308 data = [1, 2, 3, 4, 5]
1309 accumulated = [1, 3, 6, 10, 15]
1310 it = accumulate(data)
1311
1312 self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[:])
1313 self.assertEqual(next(it), 1)
1314 self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[1:])
1315 self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
1316 self.assertEqual(list(copy.copy(it)), accumulated[1:])
1317
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001318 def test_chain(self):
1319 self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
1320
1321 def test_chain_from_iterable(self):
1322 self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF')
1323
1324 def test_combinations(self):
1325 self.assertEqual(list(combinations('ABCD', 2)),
1326 [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
1327 self.assertEqual(list(combinations(range(4), 3)),
1328 [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
1329
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001330 def test_combinations_with_replacement(self):
1331 self.assertEqual(list(combinations_with_replacement('ABC', 2)),
1332 [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
1333
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001334 def test_compress(self):
1335 self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF'))
1336
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001337 def test_count(self):
1338 self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14])
1339
1340 def test_cycle(self):
1341 self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD'))
1342
1343 def test_dropwhile(self):
1344 self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1])
1345
1346 def test_groupby(self):
1347 self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')],
1348 list('ABCDAB'))
1349 self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')],
1350 [list('AAAA'), list('BBB'), list('CC'), list('D')])
1351
1352 def test_filter(self):
1353 self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9])
1354
1355 def test_filterfalse(self):
1356 self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8])
1357
1358 def test_map(self):
1359 self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000])
1360
1361 def test_islice(self):
1362 self.assertEqual(list(islice('ABCDEFG', 2)), list('AB'))
1363 self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD'))
1364 self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG'))
1365 self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG'))
1366
1367 def test_zip(self):
1368 self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')])
1369
1370 def test_zip_longest(self):
1371 self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')),
1372 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')])
1373
1374 def test_permutations(self):
1375 self.assertEqual(list(permutations('ABCD', 2)),
1376 list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split())))
1377 self.assertEqual(list(permutations(range(3))),
1378 [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)])
1379
1380 def test_product(self):
1381 self.assertEqual(list(product('ABCD', 'xy')),
1382 list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split())))
1383 self.assertEqual(list(product(range(2), repeat=3)),
1384 [(0,0,0), (0,0,1), (0,1,0), (0,1,1),
1385 (1,0,0), (1,0,1), (1,1,0), (1,1,1)])
1386
1387 def test_repeat(self):
1388 self.assertEqual(list(repeat(10, 3)), [10, 10, 10])
1389
1390 def test_stapmap(self):
1391 self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])),
1392 [32, 9, 1000])
1393
1394 def test_takewhile(self):
1395 self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4])
1396
1397
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001398class TestGC(unittest.TestCase):
1399
1400 def makecycle(self, iterator, container):
1401 container.append(iterator)
Georg Brandla18af4e2007-04-21 15:47:16 +00001402 next(iterator)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001403 del container, iterator
1404
Raymond Hettinger482ba772010-12-01 22:48:00 +00001405 def test_accumulate(self):
1406 a = []
1407 self.makecycle(accumulate([1,2,a,3]), a)
1408
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001409 def test_chain(self):
1410 a = []
1411 self.makecycle(chain(a), a)
1412
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001413 def test_chain_from_iterable(self):
1414 a = []
1415 self.makecycle(chain.from_iterable([a]), a)
1416
1417 def test_combinations(self):
1418 a = []
1419 self.makecycle(combinations([1,2,a,3], 3), a)
1420
Raymond Hettingerd07d9392009-01-27 04:20:44 +00001421 def test_combinations_with_replacement(self):
1422 a = []
1423 self.makecycle(combinations_with_replacement([1,2,a,3], 3), a)
1424
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001425 def test_compress(self):
1426 a = []
1427 self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
1428
Raymond Hettingerd6280f42009-02-16 20:50:56 +00001429 def test_count(self):
1430 a = []
1431 Int = type('Int', (int,), dict(x=a))
1432 self.makecycle(count(Int(0), Int(1)), a)
1433
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001434 def test_cycle(self):
1435 a = []
1436 self.makecycle(cycle([a]*2), a)
1437
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001438 def test_dropwhile(self):
1439 a = []
1440 self.makecycle(dropwhile(bool, [0, a, a]), a)
1441
1442 def test_groupby(self):
1443 a = []
1444 self.makecycle(groupby([a]*2, lambda x:x), a)
1445
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001446 def test_issue2246(self):
1447 # Issue 2246 -- the _grouper iterator was not included in GC
1448 n = 10
1449 keyfunc = lambda x: x
1450 for i, j in groupby(range(n), key=keyfunc):
1451 keyfunc.__dict__.setdefault('x',[]).append(j)
1452
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001453 def test_filter(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001454 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001455 self.makecycle(filter(lambda x:True, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001456
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001457 def test_filterfalse(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001458 a = []
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001459 self.makecycle(filterfalse(lambda x:False, a), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001460
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001461 def test_zip(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001462 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001463 self.makecycle(zip([a]*2, [a]*3), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001464
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001465 def test_zip_longest(self):
1466 a = []
1467 self.makecycle(zip_longest([a]*2, [a]*3), a)
1468 b = [a, None]
1469 self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a)
1470
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001471 def test_map(self):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001472 a = []
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001473 self.makecycle(map(lambda x:x, [a]*2), a)
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001474
1475 def test_islice(self):
1476 a = []
1477 self.makecycle(islice([a]*2, None), a)
1478
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001479 def test_permutations(self):
1480 a = []
1481 self.makecycle(permutations([1,2,a,3], 3), a)
1482
1483 def test_product(self):
1484 a = []
1485 self.makecycle(product([1,2,a,3], repeat=3), a)
1486
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001487 def test_repeat(self):
1488 a = []
1489 self.makecycle(repeat(a), a)
1490
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001491 def test_starmap(self):
1492 a = []
1493 self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
1494
Raymond Hettingerff5dc0e2004-09-29 11:40:50 +00001495 def test_takewhile(self):
1496 a = []
1497 self.makecycle(takewhile(bool, [1, 0, a, a]), a)
1498
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001499def R(seqn):
1500 'Regular generator'
1501 for i in seqn:
1502 yield i
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00001503
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001504class G:
1505 'Sequence using __getitem__'
1506 def __init__(self, seqn):
1507 self.seqn = seqn
1508 def __getitem__(self, i):
1509 return self.seqn[i]
1510
1511class I:
1512 'Sequence using iterator protocol'
1513 def __init__(self, seqn):
1514 self.seqn = seqn
1515 self.i = 0
1516 def __iter__(self):
1517 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001518 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001519 if self.i >= len(self.seqn): raise StopIteration
1520 v = self.seqn[self.i]
1521 self.i += 1
1522 return v
1523
1524class Ig:
1525 'Sequence using iterator protocol defined with a generator'
1526 def __init__(self, seqn):
1527 self.seqn = seqn
1528 self.i = 0
1529 def __iter__(self):
1530 for val in self.seqn:
1531 yield val
1532
1533class X:
1534 'Missing __getitem__ and __iter__'
1535 def __init__(self, seqn):
1536 self.seqn = seqn
1537 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001538 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001539 if self.i >= len(self.seqn): raise StopIteration
1540 v = self.seqn[self.i]
1541 self.i += 1
1542 return v
1543
1544class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001545 'Iterator missing __next__()'
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001546 def __init__(self, seqn):
1547 self.seqn = seqn
1548 self.i = 0
1549 def __iter__(self):
1550 return self
1551
1552class E:
1553 'Test propagation of exceptions'
1554 def __init__(self, seqn):
1555 self.seqn = seqn
1556 self.i = 0
1557 def __iter__(self):
1558 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001559 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001560 3 // 0
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001561
1562class S:
1563 'Test immediate stop'
1564 def __init__(self, seqn):
1565 pass
1566 def __iter__(self):
1567 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001568 def __next__(self):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001569 raise StopIteration
1570
1571def L(seqn):
1572 'Test multiple tiers of iterators'
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001573 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001574
1575
1576class TestVariousIteratorArgs(unittest.TestCase):
1577
Raymond Hettinger482ba772010-12-01 22:48:00 +00001578 def test_accumulate(self):
1579 s = [1,2,3,4,5]
1580 r = [1,3,6,10,15]
1581 n = len(s)
1582 for g in (G, I, Ig, L, R):
1583 self.assertEqual(list(accumulate(g(s))), r)
1584 self.assertEqual(list(accumulate(S(s))), [])
1585 self.assertRaises(TypeError, accumulate, X(s))
1586 self.assertRaises(TypeError, accumulate, N(s))
1587 self.assertRaises(ZeroDivisionError, list, accumulate(E(s)))
1588
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001589 def test_chain(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001590 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001591 for g in (G, I, Ig, S, L, R):
1592 self.assertEqual(list(chain(g(s))), list(g(s)))
1593 self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s)))
Christian Heimesf16baeb2008-02-29 14:57:44 +00001594 self.assertRaises(TypeError, list, chain(X(s)))
Mark Dickinson26a96fa2008-03-01 02:27:46 +00001595 self.assertRaises(TypeError, list, chain(N(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001596 self.assertRaises(ZeroDivisionError, list, chain(E(s)))
1597
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001598 def test_compress(self):
1599 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1600 n = len(s)
1601 for g in (G, I, Ig, S, L, R):
1602 self.assertEqual(list(compress(g(s), repeat(1))), list(g(s)))
1603 self.assertRaises(TypeError, compress, X(s), repeat(1))
1604 self.assertRaises(TypeError, compress, N(s), repeat(1))
1605 self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1)))
1606
Christian Heimesc3f30c42008-02-22 16:37:40 +00001607 def test_product(self):
1608 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
1609 self.assertRaises(TypeError, product, X(s))
1610 self.assertRaises(TypeError, product, N(s))
1611 self.assertRaises(ZeroDivisionError, product, E(s))
1612
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001613 def test_cycle(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001614 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001615 for g in (G, I, Ig, S, L, R):
1616 tgtlen = len(s) * 3
1617 expected = list(g(s))*3
1618 actual = list(islice(cycle(g(s)), tgtlen))
1619 self.assertEqual(actual, expected)
1620 self.assertRaises(TypeError, cycle, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001621 self.assertRaises(TypeError, cycle, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001622 self.assertRaises(ZeroDivisionError, list, cycle(E(s)))
1623
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001624 def test_groupby(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001625 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001626 for g in (G, I, Ig, S, L, R):
1627 self.assertEqual([k for k, sb in groupby(g(s))], list(g(s)))
1628 self.assertRaises(TypeError, groupby, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001629 self.assertRaises(TypeError, groupby, N(s))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001630 self.assertRaises(ZeroDivisionError, list, groupby(E(s)))
1631
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001632 def test_filter(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001633 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001634 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001635 self.assertEqual(list(filter(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001636 [x for x in g(s) if isEven(x)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001637 self.assertRaises(TypeError, filter, isEven, X(s))
1638 self.assertRaises(TypeError, filter, isEven, N(s))
1639 self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001640
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001641 def test_filterfalse(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001642 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001643 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001644 self.assertEqual(list(filterfalse(isEven, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001645 [x for x in g(s) if isOdd(x)])
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001646 self.assertRaises(TypeError, filterfalse, isEven, X(s))
1647 self.assertRaises(TypeError, filterfalse, isEven, N(s))
1648 self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001649
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001650 def test_zip(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001651 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001652 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001653 self.assertEqual(list(zip(g(s))), lzip(g(s)))
1654 self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s)))
1655 self.assertRaises(TypeError, zip, X(s))
1656 self.assertRaises(TypeError, zip, N(s))
1657 self.assertRaises(ZeroDivisionError, list, zip(E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001658
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001659 def test_ziplongest(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001660 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Thomas Wouterscf297e42007-02-23 15:07:44 +00001661 for g in (G, I, Ig, S, L, R):
Raymond Hettingerb0002d22008-03-13 01:41:43 +00001662 self.assertEqual(list(zip_longest(g(s))), list(zip(g(s))))
1663 self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s))))
1664 self.assertRaises(TypeError, zip_longest, X(s))
1665 self.assertRaises(TypeError, zip_longest, N(s))
1666 self.assertRaises(ZeroDivisionError, list, zip_longest(E(s)))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001667
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001668 def test_map(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001669 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001670 for g in (G, I, Ig, S, L, R):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001671 self.assertEqual(list(map(onearg, g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001672 [onearg(x) for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001673 self.assertEqual(list(map(operator.pow, g(s), g(s))),
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001674 [x**x for x in g(s)])
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001675 self.assertRaises(TypeError, map, onearg, X(s))
1676 self.assertRaises(TypeError, map, onearg, N(s))
1677 self.assertRaises(ZeroDivisionError, list, map(onearg, E(s)))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001678
1679 def test_islice(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001680 for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001681 for g in (G, I, Ig, S, L, R):
1682 self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2])
1683 self.assertRaises(TypeError, islice, X(s), 10)
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001684 self.assertRaises(TypeError, islice, N(s), 10)
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001685 self.assertRaises(ZeroDivisionError, list, islice(E(s), 10))
1686
1687 def test_starmap(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001688 for s in (range(10), range(0), range(100), (7,11), range(20,50,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001689 for g in (G, I, Ig, S, L, R):
Guido van Rossum801f0d72006-08-24 19:48:10 +00001690 ss = lzip(s, s)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001691 self.assertEqual(list(starmap(operator.pow, g(ss))),
1692 [x**x for x in g(s)])
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001693 self.assertRaises(TypeError, starmap, operator.pow, X(ss))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001694 self.assertRaises(TypeError, starmap, operator.pow, N(ss))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001695 self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss)))
1696
1697 def test_takewhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001698 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001699 for g in (G, I, Ig, S, L, R):
1700 tgt = []
1701 for elem in g(s):
1702 if not isEven(elem): break
1703 tgt.append(elem)
1704 self.assertEqual(list(takewhile(isEven, g(s))), tgt)
1705 self.assertRaises(TypeError, takewhile, isEven, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001706 self.assertRaises(TypeError, takewhile, isEven, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001707 self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s)))
1708
1709 def test_dropwhile(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001710 for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)):
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001711 for g in (G, I, Ig, S, L, R):
1712 tgt = []
1713 for elem in g(s):
1714 if not tgt and isOdd(elem): continue
1715 tgt.append(elem)
1716 self.assertEqual(list(dropwhile(isOdd, g(s))), tgt)
1717 self.assertRaises(TypeError, dropwhile, isOdd, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001718 self.assertRaises(TypeError, dropwhile, isOdd, N(s))
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001719 self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
1720
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001721 def test_tee(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001722 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001723 for g in (G, I, Ig, S, L, R):
1724 it1, it2 = tee(g(s))
1725 self.assertEqual(list(it1), list(g(s)))
1726 self.assertEqual(list(it2), list(g(s)))
1727 self.assertRaises(TypeError, tee, X(s))
Thomas Wouters8690c4e2006-04-15 09:07:20 +00001728 self.assertRaises(TypeError, tee, N(s))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001729 self.assertRaises(ZeroDivisionError, list, tee(E(s))[0])
1730
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001731class LengthTransparency(unittest.TestCase):
1732
1733 def test_repeat(self):
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001734 self.assertEqual(operator.length_hint(repeat(None, 50)), 50)
1735 self.assertEqual(operator.length_hint(repeat(None), 12), 12)
Raymond Hettinger5cab2e32004-02-10 09:25:40 +00001736
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001737class RegressionTests(unittest.TestCase):
1738
1739 def test_sf_793826(self):
1740 # Fix Armin Rigo's successful efforts to wreak havoc
1741
1742 def mutatingtuple(tuple1, f, tuple2):
1743 # this builds a tuple t which is a copy of tuple1,
1744 # then calls f(t), then mutates t to be equal to tuple2
1745 # (needs len(tuple1) == len(tuple2)).
1746 def g(value, first=[1]):
1747 if first:
1748 del first[:]
Georg Brandla18af4e2007-04-21 15:47:16 +00001749 f(next(z))
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001750 return value
1751 items = list(tuple2)
1752 items[1:1] = list(tuple1)
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001753 gen = map(g, items)
1754 z = zip(*[gen]*len(tuple1))
Georg Brandla18af4e2007-04-21 15:47:16 +00001755 next(z)
Raymond Hettingera56f6b62003-08-29 23:09:58 +00001756
1757 def f(t):
1758 global T
1759 T = t
1760 first[:] = list(T)
1761
1762 first = []
1763 mutatingtuple((1,2,3), f, (4,5,6))
1764 second = list(T)
1765 self.assertEqual(first, second)
1766
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001767
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001768 def test_sf_950057(self):
1769 # Make sure that chain() and cycle() catch exceptions immediately
1770 # rather than when shifting between input sources
1771
1772 def gen1():
1773 hist.append(0)
1774 yield 1
1775 hist.append(1)
Tim Petersbeb7c0c2004-07-18 17:34:03 +00001776 raise AssertionError
Raymond Hettinger9d7c8702004-05-08 19:49:42 +00001777 hist.append(2)
1778
1779 def gen2(x):
1780 hist.append(3)
1781 yield 2
1782 hist.append(4)
1783 if x:
1784 raise StopIteration
1785
1786 hist = []
1787 self.assertRaises(AssertionError, list, chain(gen1(), gen2(False)))
1788 self.assertEqual(hist, [0,1])
1789
1790 hist = []
1791 self.assertRaises(AssertionError, list, chain(gen1(), gen2(True)))
1792 self.assertEqual(hist, [0,1])
1793
1794 hist = []
1795 self.assertRaises(AssertionError, list, cycle(gen1()))
1796 self.assertEqual(hist, [0,1])
1797
Thomas Woutersb2137042007-02-01 18:02:27 +00001798class SubclassWithKwargsTest(unittest.TestCase):
1799 def test_keywords_in_subclass(self):
1800 # count is not subclassable...
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001801 for cls in (repeat, zip, filter, filterfalse, chain, map,
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +00001802 starmap, islice, takewhile, dropwhile, cycle, compress):
Thomas Woutersb2137042007-02-01 18:02:27 +00001803 class Subclass(cls):
1804 def __init__(self, newarg=None, *args):
1805 cls.__init__(self, *args)
1806 try:
1807 Subclass(newarg=1)
1808 except TypeError as err:
1809 # we expect type errors because of wrong argument count
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001810 self.assertNotIn("does not take keyword arguments", err.args[0])
Thomas Woutersb2137042007-02-01 18:02:27 +00001811
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02001812@support.cpython_only
1813class SizeofTest(unittest.TestCase):
1814 def setUp(self):
1815 self.ssize_t = struct.calcsize('n')
1816
1817 check_sizeof = support.check_sizeof
1818
1819 def test_product_sizeof(self):
1820 basesize = support.calcobjsize('3Pi')
1821 check = self.check_sizeof
1822 check(product('ab', '12'), basesize + 2 * self.ssize_t)
1823 check(product(*(('abc',) * 10)), basesize + 10 * self.ssize_t)
1824
1825 def test_combinations_sizeof(self):
1826 basesize = support.calcobjsize('3Pni')
1827 check = self.check_sizeof
1828 check(combinations('abcd', 3), basesize + 3 * self.ssize_t)
1829 check(combinations(range(10), 4), basesize + 4 * self.ssize_t)
1830
1831 def test_combinations_with_replacement_sizeof(self):
1832 cwr = combinations_with_replacement
1833 basesize = support.calcobjsize('3Pni')
1834 check = self.check_sizeof
1835 check(cwr('abcd', 3), basesize + 3 * self.ssize_t)
1836 check(cwr(range(10), 4), basesize + 4 * self.ssize_t)
1837
1838 def test_permutations_sizeof(self):
1839 basesize = support.calcobjsize('4Pni')
1840 check = self.check_sizeof
1841 check(permutations('abcd'),
1842 basesize + 4 * self.ssize_t + 4 * self.ssize_t)
1843 check(permutations('abcd', 3),
1844 basesize + 4 * self.ssize_t + 3 * self.ssize_t)
1845 check(permutations('abcde', 3),
1846 basesize + 5 * self.ssize_t + 3 * self.ssize_t)
1847 check(permutations(range(10), 4),
1848 basesize + 10 * self.ssize_t + 4 * self.ssize_t)
1849
Thomas Woutersb2137042007-02-01 18:02:27 +00001850
Raymond Hettingerf0fa1c02003-05-29 07:18:57 +00001851libreftest = """ Doctest for examples in the library reference: libitertools.tex
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001852
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001853
1854>>> amounts = [120.15, 764.05, 823.14]
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001855>>> for checknum, amount in zip(count(1200), amounts):
Guido van Rossum7131f842007-02-09 20:13:25 +00001856... print('Check %d is for $%.2f' % (checknum, amount))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001857...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001858Check 1200 is for $120.15
1859Check 1201 is for $764.05
1860Check 1202 is for $823.14
1861
1862>>> import operator
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001863>>> for cube in map(operator.pow, range(1,4), repeat(3)):
Guido van Rossum7131f842007-02-09 20:13:25 +00001864... print(cube)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001865...
Raymond Hettinger96ef8112003-02-01 00:10:11 +000018661
18678
186827
1869
1870>>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
Raymond Hettinger3567a872003-06-28 05:44:36 +00001871>>> for name in islice(reportlines, 3, None, 2):
Guido van Rossum7131f842007-02-09 20:13:25 +00001872... print(name.title())
Guido van Rossumd8faa362007-04-27 19:54:29 +00001873...
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001874Alex
1875Laura
1876Martin
1877Walter
1878Samuele
1879
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001880>>> from operator import itemgetter
1881>>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001882>>> di = sorted(sorted(d.items()), key=itemgetter(1))
Raymond Hettingerd25c1c62003-12-06 16:23:06 +00001883>>> for k, g in groupby(di, itemgetter(1)):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001884... print(k, list(map(itemgetter(0), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001885...
Raymond Hettingerd25c1c62003-12-06 16:23:06 +000018861 ['a', 'c', 'e']
18872 ['b', 'd', 'f']
18883 ['g']
1889
Raymond Hettinger734fb572004-01-20 20:04:40 +00001890# Find runs of consecutive numbers using groupby. The key to the solution
1891# is differencing with a range so that consecutive numbers all appear in
1892# same group.
1893>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001894>>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001895... print(list(map(operator.itemgetter(1), g)))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001896...
Raymond Hettinger734fb572004-01-20 20:04:40 +00001897[1]
1898[4, 5, 6]
1899[10]
1900[15, 16, 17, 18]
1901[22]
1902[25, 26, 27, 28]
1903
Georg Brandl3dbca812008-07-23 16:10:53 +00001904>>> def take(n, iterable):
1905... "Return first n items of the iterable as a list"
1906... return list(islice(iterable, n))
Raymond Hettingera098b332003-09-08 23:58:40 +00001907
Georg Brandl3dbca812008-07-23 16:10:53 +00001908>>> def enumerate(iterable, start=0):
1909... return zip(count(start), iterable)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001910
Georg Brandl3dbca812008-07-23 16:10:53 +00001911>>> def tabulate(function, start=0):
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001912... "Return function(0), function(1), ..."
Georg Brandl3dbca812008-07-23 16:10:53 +00001913... return map(function, count(start))
Raymond Hettinger96ef8112003-02-01 00:10:11 +00001914
Raymond Hettingercdf8ba32009-02-19 04:45:07 +00001915>>> def nth(iterable, n, default=None):
1916... "Returns the nth item or a default value"
1917... return next(islice(iterable, n, None), default)
Raymond Hettinger60eca932003-02-09 06:40:58 +00001918
Georg Brandl3dbca812008-07-23 16:10:53 +00001919>>> def quantify(iterable, pred=bool):
1920... "Count how many times the predicate is true"
1921... return sum(map(pred, iterable))
Raymond Hettinger60eca932003-02-09 06:40:58 +00001922
Georg Brandl3dbca812008-07-23 16:10:53 +00001923>>> def padnone(iterable):
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001924... "Returns the sequence elements and then returns None indefinitely"
Georg Brandl3dbca812008-07-23 16:10:53 +00001925... return chain(iterable, repeat(None))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001926
Georg Brandl3dbca812008-07-23 16:10:53 +00001927>>> def ncycles(iterable, n):
Ezio Melotti13925002011-03-16 11:05:33 +02001928... "Returns the sequence elements n times"
Georg Brandl3dbca812008-07-23 16:10:53 +00001929... return chain(*repeat(iterable, n))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001930
1931>>> def dotproduct(vec1, vec2):
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001932... return sum(map(operator.mul, vec1, vec2))
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001933
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001934>>> def flatten(listOfLists):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001935... return list(chain.from_iterable(listOfLists))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00001936
1937>>> def repeatfunc(func, times=None, *args):
1938... "Repeat calls to func with specified arguments."
1939... " Example: repeatfunc(random.random)"
1940... if times is None:
1941... return starmap(func, repeat(args))
1942... else:
1943... return starmap(func, repeat(args, times))
1944
Raymond Hettingerd591f662003-10-26 15:34:50 +00001945>>> def pairwise(iterable):
1946... "s -> (s0,s1), (s1,s2), (s2, s3), ..."
1947... a, b = tee(iterable)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001948... try:
Georg Brandla18af4e2007-04-21 15:47:16 +00001949... next(b)
Raymond Hettingerad983e72003-11-12 14:32:26 +00001950... except StopIteration:
1951... pass
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00001952... return zip(a, b)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00001953
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001954>>> def grouper(n, iterable, fillvalue=None):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001955... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001956... args = [iter(iterable)] * n
Raymond Hettinger883d2762009-01-27 04:57:51 +00001957... return zip_longest(*args, fillvalue=fillvalue)
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001958
1959>>> def roundrobin(*iterables):
Raymond Hettingerf5a2e472008-07-30 07:37:37 +00001960... "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001961... # Recipe credited to George Sakkis
1962... pending = len(iterables)
1963... nexts = cycle(iter(it).__next__ for it in iterables)
1964... while pending:
1965... try:
1966... for next in nexts:
1967... yield next()
1968... except StopIteration:
1969... pending -= 1
1970... nexts = cycle(islice(nexts, pending))
1971
1972>>> def powerset(iterable):
Raymond Hettingerace67332009-01-26 02:23:50 +00001973... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
1974... s = list(iterable)
1975... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001976
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00001977>>> def unique_everseen(iterable, key=None):
1978... "List unique elements, preserving order. Remember all elements ever seen."
1979... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1980... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1981... seen = set()
1982... seen_add = seen.add
1983... if key is None:
1984... for element in iterable:
1985... if element not in seen:
1986... seen_add(element)
1987... yield element
1988... else:
1989... for element in iterable:
1990... k = key(element)
1991... if k not in seen:
1992... seen_add(k)
1993... yield element
1994
1995>>> def unique_justseen(iterable, key=None):
1996... "List unique elements, preserving order. Remember only the element just seen."
1997... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1998... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1999... return map(next, map(itemgetter(1), groupby(iterable, key)))
2000
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002001This is not part of the examples but it tests to make sure the definitions
2002perform as purported.
2003
Raymond Hettingera098b332003-09-08 23:58:40 +00002004>>> take(10, count())
2005[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2006
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002007>>> list(enumerate('abc'))
2008[(0, 'a'), (1, 'b'), (2, 'c')]
2009
2010>>> list(islice(tabulate(lambda x: 2*x), 4))
2011[0, 2, 4, 6]
2012
2013>>> nth('abcde', 3)
Raymond Hettingerd04fa312009-02-04 19:45:13 +00002014'd'
2015
2016>>> nth('abcde', 9) is None
2017True
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002018
Guido van Rossum805365e2007-05-07 22:24:25 +00002019>>> quantify(range(99), lambda x: x%2==0)
Raymond Hettingerb5a42082003-08-08 05:10:41 +0000202050
2021
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002022>>> a = [[1, 2, 3], [4, 5, 6]]
2023>>> flatten(a)
2024[1, 2, 3, 4, 5, 6]
2025
2026>>> list(repeatfunc(pow, 5, 2, 3))
2027[8, 8, 8, 8, 8]
2028
2029>>> import random
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002030>>> take(5, map(int, repeatfunc(random.random)))
Raymond Hettinger6a5b0272003-10-24 08:45:23 +00002031[0, 0, 0, 0, 0]
2032
Raymond Hettingerd591f662003-10-26 15:34:50 +00002033>>> list(pairwise('abcd'))
2034[('a', 'b'), ('b', 'c'), ('c', 'd')]
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002035
Raymond Hettingerd591f662003-10-26 15:34:50 +00002036>>> list(pairwise([]))
2037[]
2038
2039>>> list(pairwise('a'))
Raymond Hettingerbefa37d2003-06-18 19:25:37 +00002040[]
2041
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002042>>> list(islice(padnone('abc'), 0, 6))
2043['a', 'b', 'c', None, None, None]
2044
2045>>> list(ncycles('abc', 3))
2046['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
2047
2048>>> dotproduct([1,2,3], [4,5,6])
204932
2050
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002051>>> list(grouper(3, 'abcdefg', 'x'))
2052[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
2053
2054>>> list(roundrobin('abc', 'd', 'ef'))
2055['a', 'd', 'e', 'b', 'f', 'c']
2056
Raymond Hettingerace67332009-01-26 02:23:50 +00002057>>> list(powerset([1,2,3]))
2058[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002059
Raymond Hettinger191e8502009-01-27 13:29:43 +00002060>>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
2061True
2062
2063>>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
2064True
2065
Raymond Hettingerad9d96b2009-01-02 21:39:07 +00002066>>> list(unique_everseen('AAAABBBCCDAABBB'))
2067['A', 'B', 'C', 'D']
2068
2069>>> list(unique_everseen('ABBCcAD', str.lower))
2070['A', 'B', 'C', 'D']
2071
2072>>> list(unique_justseen('AAAABBBCCDAABBB'))
2073['A', 'B', 'C', 'D', 'A', 'B']
2074
2075>>> list(unique_justseen('ABBCcAD', str.lower))
2076['A', 'B', 'C', 'A', 'D']
2077
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002078"""
2079
2080__test__ = {'libreftest' : libreftest}
2081
2082def test_main(verbose=None):
Raymond Hettingera56f6b62003-08-29 23:09:58 +00002083 test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
Thomas Woutersb2137042007-02-01 18:02:27 +00002084 RegressionTests, LengthTransparency,
Serhiy Storchaka2dae92a2013-12-09 17:45:57 +02002085 SubclassWithKwargsTest, TestExamples,
2086 SizeofTest)
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002087 support.run_unittest(*test_classes)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002088
2089 # verify reference counting
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002090 if verbose and hasattr(sys, "gettotalrefcount"):
Raymond Hettinger02420702003-06-29 20:36:23 +00002091 import gc
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002092 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002093 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002094 support.run_unittest(*test_classes)
Raymond Hettinger02420702003-06-29 20:36:23 +00002095 gc.collect()
Raymond Hettinger8fd3f872003-05-02 22:38:07 +00002096 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002097 print(counts)
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002098
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002099 # doctest the examples in the library reference
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002100 support.run_doctest(sys.modules[__name__], verbose)
Raymond Hettinger14ef54c2003-05-02 19:04:37 +00002101
Raymond Hettinger96ef8112003-02-01 00:10:11 +00002102if __name__ == "__main__":
2103 test_main(verbose=True)