blob: 9cdad6ee858b4599caafef92f28bff7ecce47e18 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`itertools` --- Functions creating iterators for efficient looping
2=======================================================================
3
4.. module:: itertools
Raymond Hettinger30c73622010-12-01 23:45:20 +00005 :synopsis: Functions creating iterators for efficient looping.
Georg Brandl116aa622007-08-15 14:28:22 +00006.. moduleauthor:: Raymond Hettinger <python@rcn.com>
7.. sectionauthor:: Raymond Hettinger <python@rcn.com>
8
9
Christian Heimesfe337bf2008-03-23 21:54:12 +000010.. testsetup::
11
Raymond Hettinger30c73622010-12-01 23:45:20 +000012 from itertools import *
Christian Heimesfe337bf2008-03-23 21:54:12 +000013
14
Raymond Hettingerf76b9202009-02-17 20:00:59 +000015This module implements a number of :term:`iterator` building blocks inspired
16by constructs from APL, Haskell, and SML. Each has been recast in a form
17suitable for Python.
Georg Brandl116aa622007-08-15 14:28:22 +000018
19The module standardizes a core set of fast, memory efficient tools that are
Raymond Hettingerf76b9202009-02-17 20:00:59 +000020useful by themselves or in combination. Together, they form an "iterator
21algebra" making it possible to construct specialized tools succinctly and
22efficiently in pure Python.
Georg Brandl116aa622007-08-15 14:28:22 +000023
24For instance, SML provides a tabulation tool: ``tabulate(f)`` which produces a
Ezio Melottib6605992010-01-21 20:57:24 +000025sequence ``f(0), f(1), ...``. The same effect can be achieved in Python
Raymond Hettingera6c60372008-03-13 01:26:19 +000026by combining :func:`map` and :func:`count` to form ``map(f, count())``.
Georg Brandl116aa622007-08-15 14:28:22 +000027
Raymond Hettinger2c109ab2009-03-12 00:29:44 +000028These tools and their built-in counterparts also work well with the high-speed
29functions in the :mod:`operator` module. For example, the multiplication
30operator can be mapped across two vectors to form an efficient dot-product:
31``sum(map(operator.mul, vector1, vector2))``.
Georg Brandl116aa622007-08-15 14:28:22 +000032
Georg Brandl116aa622007-08-15 14:28:22 +000033
Raymond Hettingerf76b9202009-02-17 20:00:59 +000034**Infinite Iterators:**
Georg Brandl116aa622007-08-15 14:28:22 +000035
Raymond Hettinger5bfd8ce2009-04-10 19:02:36 +000036================== ================= ================================================= =========================================
37Iterator Arguments Results Example
38================== ================= ================================================= =========================================
39:func:`count` start, [step] start, start+step, start+2*step, ... ``count(10) --> 10 11 12 13 14 ...``
40:func:`cycle` p p0, p1, ... plast, p0, p1, ... ``cycle('ABCD') --> A B C D A B C D ...``
41:func:`repeat` elem [,n] elem, elem, elem, ... endlessly or up to n times ``repeat(10, 3) --> 10 10 10``
42================== ================= ================================================= =========================================
Georg Brandl116aa622007-08-15 14:28:22 +000043
Raymond Hettingerf76b9202009-02-17 20:00:59 +000044**Iterators terminating on the shortest input sequence:**
45
Raymond Hettinger5bfd8ce2009-04-10 19:02:36 +000046==================== ============================ ================================================= =============================================================
47Iterator Arguments Results Example
48==================== ============================ ================================================= =============================================================
Raymond Hettinger5d446132011-03-27 18:52:10 -070049:func:`accumulate` p [,func] p0, p0+p1, p0+p1+p2, ... ``accumulate([1,2,3,4,5]) --> 1 3 6 10 15``
Raymond Hettinger5bfd8ce2009-04-10 19:02:36 +000050:func:`chain` p, q, ... p0, p1, ... plast, q0, q1, ... ``chain('ABC', 'DEF') --> A B C D E F``
51:func:`compress` data, selectors (d[0] if s[0]), (d[1] if s[1]), ... ``compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F``
52:func:`dropwhile` pred, seq seq[n], seq[n+1], starting when pred fails ``dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1``
Georg Brandlc2da5ce2009-08-13 09:16:39 +000053:func:`filterfalse` pred, seq elements of seq where pred(elem) is False ``filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8``
Raymond Hettinger5bfd8ce2009-04-10 19:02:36 +000054:func:`groupby` iterable[, keyfunc] sub-iterators grouped by value of keyfunc(v)
55:func:`islice` seq, [start,] stop [, step] elements from seq[start:stop:step] ``islice('ABCDEFG', 2, None) --> C D E F G``
56:func:`starmap` func, seq func(\*seq[0]), func(\*seq[1]), ... ``starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000``
57:func:`takewhile` pred, seq seq[0], seq[1], until pred fails ``takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4``
58:func:`tee` it, n it1, it2 , ... itn splits one iterator into n
Georg Brandlc2da5ce2009-08-13 09:16:39 +000059:func:`zip_longest` p, q, ... (p[0], q[0]), (p[1], q[1]), ... ``zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-``
Raymond Hettinger5bfd8ce2009-04-10 19:02:36 +000060==================== ============================ ================================================= =============================================================
Raymond Hettingerf76b9202009-02-17 20:00:59 +000061
62**Combinatoric generators:**
63
Raymond Hettinger7f587cd2009-04-10 19:43:50 +000064============================================== ==================== =============================================================
65Iterator Arguments Results
66============================================== ==================== =============================================================
67:func:`product` p, q, ... [repeat=1] cartesian product, equivalent to a nested for-loop
68:func:`permutations` p[, r] r-length tuples, all possible orderings, no repeated elements
Raymond Hettinger36c3c022009-11-19 01:20:07 +000069:func:`combinations` p, r r-length tuples, in sorted order, no repeated elements
70:func:`combinations_with_replacement` p, r r-length tuples, in sorted order, with repeated elements
Raymond Hettinger7f587cd2009-04-10 19:43:50 +000071``product('ABCD', repeat=2)`` ``AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD``
72``permutations('ABCD', 2)`` ``AB AC AD BA BC BD CA CB CD DA DB DC``
73``combinations('ABCD', 2)`` ``AB AC AD BC BD CD``
74``combinations_with_replacement('ABCD', 2)`` ``AA AB AC AD BB BC BD CC CD DD``
75============================================== ==================== =============================================================
Georg Brandl116aa622007-08-15 14:28:22 +000076
77
78.. _itertools-functions:
79
80Itertool functions
81------------------
82
83The following module functions all construct and return iterators. Some provide
84streams of infinite length, so they should only be accessed by functions or
85loops that truncate the stream.
86
Raymond Hettinger5d446132011-03-27 18:52:10 -070087.. function:: accumulate(iterable[, func])
Raymond Hettingeradb81462010-12-01 22:50:36 +000088
Raymond Hettinger2d93e6e2010-12-03 02:33:53 +000089 Make an iterator that returns accumulated sums. Elements may be any addable
Raymond Hettinger5d446132011-03-27 18:52:10 -070090 type including :class:`Decimal` or :class:`Fraction`. If the optional
91 *func* argument is supplied, it should be a function of two arguments
92 and it will be used instead of addition.
Raymond Hettingeradb81462010-12-01 22:50:36 +000093
Raymond Hettinger5d446132011-03-27 18:52:10 -070094 Equivalent to::
95
96 def accumulate(iterable, func=operator.add):
Raymond Hettingeradb81462010-12-01 22:50:36 +000097 'Return running totals'
Raymond Hettingerd8ff4652010-12-03 02:09:34 +000098 # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
Raymond Hettinger5d446132011-03-27 18:52:10 -070099 # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000100 it = iter(iterable)
101 total = next(it)
102 yield total
103 for element in it:
Raymond Hettinger5d446132011-03-27 18:52:10 -0700104 total = func(total, element)
Raymond Hettingerd8ff4652010-12-03 02:09:34 +0000105 yield total
Raymond Hettingeradb81462010-12-01 22:50:36 +0000106
Raymond Hettinger295c1d42011-04-21 11:09:28 -0700107 There are a number of uses for the *func* argument. It can be set to
108 :func:`min` for a running minimum, :func:`max` for a running maximum, or
109 :func:`operator.mul` for a running product. Amortization tables can be
110 built by accumulating interest and applying payments. First-order
111 `recurrence relations <http://en.wikipedia.org/wiki/Recurrence_relation>`_
112 can be modeled by supplying the initial value in the iterable and using only
113 the accumulated total in *func* argument::
Raymond Hettinger5d446132011-03-27 18:52:10 -0700114
115 >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
116 >>> list(accumulate(data, operator.mul)) # running product
117 [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
118 >>> list(accumulate(data, max)) # running maximum
119 [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
120
121 # Amortize a 5% loan of 1000 with 4 annual payments of 90
122 >>> cashflows = [1000, -90, -90, -90, -90]
123 >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt))
124 [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]
125
Raymond Hettinger295c1d42011-04-21 11:09:28 -0700126 # Chaotic recurrence relation http://en.wikipedia.org/wiki/Logistic_map
127 >>> logistic_map = lambda x, _: r * x * (1 - x)
128 >>> r = 3.8
129 >>> x0 = 0.4
130 >>> inputs = repeat(x0, 36) # only the initial value is used
131 >>> [format(x, '.2f') for x in accumulate(inputs, logistic_map)]
132 ['0.40', '0.91', '0.30', '0.81', '0.60', '0.92', '0.29', '0.79', '0.63',
133 '0.88' ,'0.39', '0.90', '0.33', '0.84', '0.52', '0.95', '0.18', '0.57',
134 '0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32',
135 '0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60']
136
Raymond Hettingeradb81462010-12-01 22:50:36 +0000137 .. versionadded:: 3.2
Georg Brandl116aa622007-08-15 14:28:22 +0000138
Raymond Hettinger5d446132011-03-27 18:52:10 -0700139 .. versionchanged:: 3.3
140 Added the optional *func* parameter.
141
Georg Brandl116aa622007-08-15 14:28:22 +0000142.. function:: chain(*iterables)
143
Raymond Hettinger30c73622010-12-01 23:45:20 +0000144 Make an iterator that returns elements from the first iterable until it is
145 exhausted, then proceeds to the next iterable, until all of the iterables are
146 exhausted. Used for treating consecutive sequences as a single sequence.
147 Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000148
Raymond Hettinger30c73622010-12-01 23:45:20 +0000149 def chain(*iterables):
150 # chain('ABC', 'DEF') --> A B C D E F
151 for it in iterables:
152 for element in it:
153 yield element
Georg Brandl116aa622007-08-15 14:28:22 +0000154
155
Georg Brandl933b9742010-07-29 14:36:11 +0000156.. classmethod:: chain.from_iterable(iterable)
Christian Heimes70e7ea22008-02-28 20:02:27 +0000157
Raymond Hettinger30c73622010-12-01 23:45:20 +0000158 Alternate constructor for :func:`chain`. Gets chained inputs from a
159 single iterable argument that is evaluated lazily. Equivalent to::
Christian Heimes70e7ea22008-02-28 20:02:27 +0000160
Raymond Hettinger30c73622010-12-01 23:45:20 +0000161 @classmethod
162 def from_iterable(iterables):
163 # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
164 for it in iterables:
165 for element in it:
166 yield element
Christian Heimes70e7ea22008-02-28 20:02:27 +0000167
Christian Heimes78644762008-03-04 23:39:23 +0000168
Christian Heimes836baa52008-02-26 08:18:30 +0000169.. function:: combinations(iterable, r)
170
Raymond Hettinger30c73622010-12-01 23:45:20 +0000171 Return *r* length subsequences of elements from the input *iterable*.
Christian Heimes836baa52008-02-26 08:18:30 +0000172
Raymond Hettinger30c73622010-12-01 23:45:20 +0000173 Combinations are emitted in lexicographic sort order. So, if the
174 input *iterable* is sorted, the combination tuples will be produced
175 in sorted order.
Christian Heimes836baa52008-02-26 08:18:30 +0000176
Raymond Hettinger30c73622010-12-01 23:45:20 +0000177 Elements are treated as unique based on their position, not on their
178 value. So if the input elements are unique, there will be no repeat
179 values in each combination.
Christian Heimes836baa52008-02-26 08:18:30 +0000180
Raymond Hettinger30c73622010-12-01 23:45:20 +0000181 Equivalent to::
Christian Heimes836baa52008-02-26 08:18:30 +0000182
183 def combinations(iterable, r):
Raymond Hettingerdd1150e2008-03-13 02:39:40 +0000184 # combinations('ABCD', 2) --> AB AC AD BC BD CD
185 # combinations(range(4), 3) --> 012 013 023 123
Christian Heimes836baa52008-02-26 08:18:30 +0000186 pool = tuple(iterable)
Christian Heimes380f7f22008-02-28 11:19:05 +0000187 n = len(pool)
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000188 if r > n:
189 return
190 indices = list(range(r))
Christian Heimesb558a2e2008-03-02 22:46:37 +0000191 yield tuple(pool[i] for i in indices)
Raymond Hettingercf984ce2009-02-18 20:56:51 +0000192 while True:
Christian Heimes380f7f22008-02-28 11:19:05 +0000193 for i in reversed(range(r)):
Christian Heimesb558a2e2008-03-02 22:46:37 +0000194 if indices[i] != i + n - r:
Christian Heimes836baa52008-02-26 08:18:30 +0000195 break
Christian Heimes380f7f22008-02-28 11:19:05 +0000196 else:
197 return
Christian Heimesb558a2e2008-03-02 22:46:37 +0000198 indices[i] += 1
Christian Heimes380f7f22008-02-28 11:19:05 +0000199 for j in range(i+1, r):
Christian Heimesb558a2e2008-03-02 22:46:37 +0000200 indices[j] = indices[j-1] + 1
201 yield tuple(pool[i] for i in indices)
Christian Heimes836baa52008-02-26 08:18:30 +0000202
Raymond Hettinger30c73622010-12-01 23:45:20 +0000203 The code for :func:`combinations` can be also expressed as a subsequence
204 of :func:`permutations` after filtering entries where the elements are not
205 in sorted order (according to their position in the input pool)::
Christian Heimes78644762008-03-04 23:39:23 +0000206
207 def combinations(iterable, r):
208 pool = tuple(iterable)
209 n = len(pool)
210 for indices in permutations(range(n), r):
211 if sorted(indices) == list(indices):
212 yield tuple(pool[i] for i in indices)
213
Raymond Hettinger30c73622010-12-01 23:45:20 +0000214 The number of items returned is ``n! / r! / (n-r)!`` when ``0 <= r <= n``
215 or zero when ``r > n``.
Christian Heimes836baa52008-02-26 08:18:30 +0000216
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000217.. function:: combinations_with_replacement(iterable, r)
218
Raymond Hettinger30c73622010-12-01 23:45:20 +0000219 Return *r* length subsequences of elements from the input *iterable*
220 allowing individual elements to be repeated more than once.
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000221
Raymond Hettinger30c73622010-12-01 23:45:20 +0000222 Combinations are emitted in lexicographic sort order. So, if the
223 input *iterable* is sorted, the combination tuples will be produced
224 in sorted order.
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000225
Raymond Hettinger30c73622010-12-01 23:45:20 +0000226 Elements are treated as unique based on their position, not on their
227 value. So if the input elements are unique, the generated combinations
228 will also be unique.
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000229
Raymond Hettinger30c73622010-12-01 23:45:20 +0000230 Equivalent to::
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000231
232 def combinations_with_replacement(iterable, r):
233 # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
234 pool = tuple(iterable)
235 n = len(pool)
236 if not n and r:
237 return
238 indices = [0] * r
239 yield tuple(pool[i] for i in indices)
Raymond Hettingercf984ce2009-02-18 20:56:51 +0000240 while True:
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000241 for i in reversed(range(r)):
242 if indices[i] != n - 1:
243 break
244 else:
245 return
246 indices[i:] = [indices[i] + 1] * (r - i)
247 yield tuple(pool[i] for i in indices)
248
Raymond Hettinger30c73622010-12-01 23:45:20 +0000249 The code for :func:`combinations_with_replacement` can be also expressed as
250 a subsequence of :func:`product` after filtering entries where the elements
251 are not in sorted order (according to their position in the input pool)::
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000252
253 def combinations_with_replacement(iterable, r):
254 pool = tuple(iterable)
255 n = len(pool)
256 for indices in product(range(n), repeat=r):
257 if sorted(indices) == list(indices):
258 yield tuple(pool[i] for i in indices)
259
Raymond Hettinger30c73622010-12-01 23:45:20 +0000260 The number of items returned is ``(n+r-1)! / r! / (n-1)!`` when ``n > 0``.
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000261
Raymond Hettinger30c73622010-12-01 23:45:20 +0000262 .. versionadded:: 3.1
Raymond Hettingerd07d9392009-01-27 04:20:44 +0000263
Georg Brandl67b21b72010-08-17 15:07:14 +0000264
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000265.. function:: compress(data, selectors)
266
Raymond Hettinger30c73622010-12-01 23:45:20 +0000267 Make an iterator that filters elements from *data* returning only those that
268 have a corresponding element in *selectors* that evaluates to ``True``.
269 Stops when either the *data* or *selectors* iterables has been exhausted.
270 Equivalent to::
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000271
Raymond Hettinger30c73622010-12-01 23:45:20 +0000272 def compress(data, selectors):
273 # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
274 return (d for d, s in zip(data, selectors) if s)
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000275
Raymond Hettinger30c73622010-12-01 23:45:20 +0000276 .. versionadded:: 3.1
Raymond Hettinger6b3b0fc2009-01-26 02:56:58 +0000277
278
Raymond Hettinger9e8dbbc2009-02-14 04:21:49 +0000279.. function:: count(start=0, step=1)
Georg Brandl116aa622007-08-15 14:28:22 +0000280
Raymond Hettinger30c73622010-12-01 23:45:20 +0000281 Make an iterator that returns evenly spaced values starting with *n*. Often
282 used as an argument to :func:`map` to generate consecutive data points.
283 Also, used with :func:`zip` to add sequence numbers. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000284
Raymond Hettinger30c73622010-12-01 23:45:20 +0000285 def count(start=0, step=1):
286 # count(10) --> 10 11 12 13 14 ...
Georg Brandl37a80dc2011-01-13 07:31:18 +0000287 # count(2.5, 0.5) -> 2.5 3.0 3.5 ...
Raymond Hettinger30c73622010-12-01 23:45:20 +0000288 n = start
289 while True:
290 yield n
291 n += step
Georg Brandl116aa622007-08-15 14:28:22 +0000292
Raymond Hettinger30c73622010-12-01 23:45:20 +0000293 When counting with floating point numbers, better accuracy can sometimes be
294 achieved by substituting multiplicative code such as: ``(start + step * i
295 for i in count())``.
Raymond Hettinger5bc472a2009-06-17 01:40:52 +0000296
Raymond Hettinger30c73622010-12-01 23:45:20 +0000297 .. versionchanged:: 3.1
298 Added *step* argument and allowed non-integer arguments.
Georg Brandl116aa622007-08-15 14:28:22 +0000299
300.. function:: cycle(iterable)
301
Raymond Hettinger30c73622010-12-01 23:45:20 +0000302 Make an iterator returning elements from the iterable and saving a copy of each.
303 When the iterable is exhausted, return elements from the saved copy. Repeats
304 indefinitely. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000305
Raymond Hettinger30c73622010-12-01 23:45:20 +0000306 def cycle(iterable):
307 # cycle('ABCD') --> A B C D A B C D A B C D ...
308 saved = []
309 for element in iterable:
310 yield element
311 saved.append(element)
312 while saved:
313 for element in saved:
Georg Brandl116aa622007-08-15 14:28:22 +0000314 yield element
315
Raymond Hettinger30c73622010-12-01 23:45:20 +0000316 Note, this member of the toolkit may require significant auxiliary storage
317 (depending on the length of the iterable).
Georg Brandl116aa622007-08-15 14:28:22 +0000318
319
320.. function:: dropwhile(predicate, iterable)
321
Raymond Hettinger30c73622010-12-01 23:45:20 +0000322 Make an iterator that drops elements from the iterable as long as the predicate
323 is true; afterwards, returns every element. Note, the iterator does not produce
324 *any* output until the predicate first becomes false, so it may have a lengthy
325 start-up time. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000326
Raymond Hettinger30c73622010-12-01 23:45:20 +0000327 def dropwhile(predicate, iterable):
328 # dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
329 iterable = iter(iterable)
330 for x in iterable:
331 if not predicate(x):
332 yield x
333 break
334 for x in iterable:
335 yield x
Georg Brandl116aa622007-08-15 14:28:22 +0000336
Raymond Hettinger749761e2009-01-27 04:42:48 +0000337.. function:: filterfalse(predicate, iterable)
338
Raymond Hettinger30c73622010-12-01 23:45:20 +0000339 Make an iterator that filters elements from iterable returning only those for
340 which the predicate is ``False``. If *predicate* is ``None``, return the items
341 that are false. Equivalent to::
Raymond Hettinger749761e2009-01-27 04:42:48 +0000342
Raymond Hettinger30c73622010-12-01 23:45:20 +0000343 def filterfalse(predicate, iterable):
344 # filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
345 if predicate is None:
346 predicate = bool
347 for x in iterable:
348 if not predicate(x):
349 yield x
Raymond Hettinger749761e2009-01-27 04:42:48 +0000350
Georg Brandl116aa622007-08-15 14:28:22 +0000351
Georg Brandl3dd33882009-06-01 17:35:27 +0000352.. function:: groupby(iterable, key=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000353
Raymond Hettinger30c73622010-12-01 23:45:20 +0000354 Make an iterator that returns consecutive keys and groups from the *iterable*.
355 The *key* is a function computing a key value for each element. If not
356 specified or is ``None``, *key* defaults to an identity function and returns
357 the element unchanged. Generally, the iterable needs to already be sorted on
358 the same key function.
Georg Brandl116aa622007-08-15 14:28:22 +0000359
Raymond Hettinger30c73622010-12-01 23:45:20 +0000360 The operation of :func:`groupby` is similar to the ``uniq`` filter in Unix. It
361 generates a break or new group every time the value of the key function changes
362 (which is why it is usually necessary to have sorted the data using the same key
363 function). That behavior differs from SQL's GROUP BY which aggregates common
364 elements regardless of their input order.
Georg Brandl116aa622007-08-15 14:28:22 +0000365
Raymond Hettinger30c73622010-12-01 23:45:20 +0000366 The returned group is itself an iterator that shares the underlying iterable
367 with :func:`groupby`. Because the source is shared, when the :func:`groupby`
368 object is advanced, the previous group is no longer visible. So, if that data
369 is needed later, it should be stored as a list::
Georg Brandl116aa622007-08-15 14:28:22 +0000370
Raymond Hettinger30c73622010-12-01 23:45:20 +0000371 groups = []
372 uniquekeys = []
373 data = sorted(data, key=keyfunc)
374 for k, g in groupby(data, keyfunc):
375 groups.append(list(g)) # Store group iterator as a list
376 uniquekeys.append(k)
Georg Brandl116aa622007-08-15 14:28:22 +0000377
Raymond Hettinger30c73622010-12-01 23:45:20 +0000378 :func:`groupby` is equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000379
Raymond Hettinger30c73622010-12-01 23:45:20 +0000380 class groupby:
381 # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
382 # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
383 def __init__(self, iterable, key=None):
384 if key is None:
385 key = lambda x: x
386 self.keyfunc = key
387 self.it = iter(iterable)
388 self.tgtkey = self.currkey = self.currvalue = object()
389 def __iter__(self):
390 return self
391 def __next__(self):
392 while self.currkey == self.tgtkey:
393 self.currvalue = next(self.it) # Exit on StopIteration
394 self.currkey = self.keyfunc(self.currvalue)
395 self.tgtkey = self.currkey
396 return (self.currkey, self._grouper(self.tgtkey))
397 def _grouper(self, tgtkey):
398 while self.currkey == tgtkey:
399 yield self.currvalue
400 self.currvalue = next(self.it) # Exit on StopIteration
401 self.currkey = self.keyfunc(self.currvalue)
Georg Brandl116aa622007-08-15 14:28:22 +0000402
Georg Brandl116aa622007-08-15 14:28:22 +0000403
Georg Brandl116aa622007-08-15 14:28:22 +0000404.. function:: islice(iterable, [start,] stop [, step])
405
Raymond Hettinger30c73622010-12-01 23:45:20 +0000406 Make an iterator that returns selected elements from the iterable. If *start* is
407 non-zero, then elements from the iterable are skipped until start is reached.
408 Afterward, elements are returned consecutively unless *step* is set higher than
409 one which results in items being skipped. If *stop* is ``None``, then iteration
410 continues until the iterator is exhausted, if at all; otherwise, it stops at the
411 specified position. Unlike regular slicing, :func:`islice` does not support
412 negative values for *start*, *stop*, or *step*. Can be used to extract related
413 fields from data where the internal structure has been flattened (for example, a
414 multi-line report may list a name field on every third line). Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000415
Raymond Hettinger30c73622010-12-01 23:45:20 +0000416 def islice(iterable, *args):
417 # islice('ABCDEFG', 2) --> A B
418 # islice('ABCDEFG', 2, 4) --> C D
419 # islice('ABCDEFG', 2, None) --> C D E F G
420 # islice('ABCDEFG', 0, None, 2) --> A C E G
421 s = slice(*args)
422 it = iter(range(s.start or 0, s.stop or sys.maxsize, s.step or 1))
423 nexti = next(it)
424 for i, element in enumerate(iterable):
425 if i == nexti:
426 yield element
427 nexti = next(it)
Georg Brandl116aa622007-08-15 14:28:22 +0000428
Raymond Hettinger30c73622010-12-01 23:45:20 +0000429 If *start* is ``None``, then iteration starts at zero. If *step* is ``None``,
430 then the step defaults to one.
Georg Brandl116aa622007-08-15 14:28:22 +0000431
Georg Brandl116aa622007-08-15 14:28:22 +0000432
Georg Brandl3dd33882009-06-01 17:35:27 +0000433.. function:: permutations(iterable, r=None)
Christian Heimes70e7ea22008-02-28 20:02:27 +0000434
Raymond Hettinger30c73622010-12-01 23:45:20 +0000435 Return successive *r* length permutations of elements in the *iterable*.
Christian Heimes70e7ea22008-02-28 20:02:27 +0000436
Raymond Hettinger30c73622010-12-01 23:45:20 +0000437 If *r* is not specified or is ``None``, then *r* defaults to the length
438 of the *iterable* and all possible full-length permutations
439 are generated.
Christian Heimes70e7ea22008-02-28 20:02:27 +0000440
Raymond Hettinger30c73622010-12-01 23:45:20 +0000441 Permutations are emitted in lexicographic sort order. So, if the
442 input *iterable* is sorted, the permutation tuples will be produced
443 in sorted order.
Christian Heimes70e7ea22008-02-28 20:02:27 +0000444
Raymond Hettinger30c73622010-12-01 23:45:20 +0000445 Elements are treated as unique based on their position, not on their
446 value. So if the input elements are unique, there will be no repeat
447 values in each permutation.
Christian Heimes70e7ea22008-02-28 20:02:27 +0000448
Raymond Hettinger30c73622010-12-01 23:45:20 +0000449 Equivalent to::
Christian Heimesb558a2e2008-03-02 22:46:37 +0000450
451 def permutations(iterable, r=None):
Raymond Hettingerdd1150e2008-03-13 02:39:40 +0000452 # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
453 # permutations(range(3)) --> 012 021 102 120 201 210
Christian Heimesb558a2e2008-03-02 22:46:37 +0000454 pool = tuple(iterable)
455 n = len(pool)
456 r = n if r is None else r
Raymond Hettinger5bad41e2009-01-08 21:01:54 +0000457 if r > n:
458 return
459 indices = list(range(n))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000460 cycles = range(n, n-r, -1)
Christian Heimesb558a2e2008-03-02 22:46:37 +0000461 yield tuple(pool[i] for i in indices[:r])
462 while n:
463 for i in reversed(range(r)):
464 cycles[i] -= 1
465 if cycles[i] == 0:
466 indices[i:] = indices[i+1:] + indices[i:i+1]
467 cycles[i] = n - i
468 else:
469 j = cycles[i]
470 indices[i], indices[-j] = indices[-j], indices[i]
471 yield tuple(pool[i] for i in indices[:r])
472 break
473 else:
474 return
Christian Heimes70e7ea22008-02-28 20:02:27 +0000475
Raymond Hettinger30c73622010-12-01 23:45:20 +0000476 The code for :func:`permutations` can be also expressed as a subsequence of
477 :func:`product`, filtered to exclude entries with repeated elements (those
478 from the same position in the input pool)::
Christian Heimes78644762008-03-04 23:39:23 +0000479
480 def permutations(iterable, r=None):
481 pool = tuple(iterable)
482 n = len(pool)
483 r = n if r is None else r
484 for indices in product(range(n), repeat=r):
485 if len(set(indices)) == r:
486 yield tuple(pool[i] for i in indices)
487
Raymond Hettinger30c73622010-12-01 23:45:20 +0000488 The number of items returned is ``n! / (n-r)!`` when ``0 <= r <= n``
489 or zero when ``r > n``.
Christian Heimes70e7ea22008-02-28 20:02:27 +0000490
Georg Brandl3dd33882009-06-01 17:35:27 +0000491.. function:: product(*iterables, repeat=1)
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000492
Raymond Hettinger30c73622010-12-01 23:45:20 +0000493 Cartesian product of input iterables.
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000494
Raymond Hettinger30c73622010-12-01 23:45:20 +0000495 Equivalent to nested for-loops in a generator expression. For example,
496 ``product(A, B)`` returns the same as ``((x,y) for x in A for y in B)``.
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000497
Raymond Hettinger30c73622010-12-01 23:45:20 +0000498 The nested loops cycle like an odometer with the rightmost element advancing
499 on every iteration. This pattern creates a lexicographic ordering so that if
500 the input's iterables are sorted, the product tuples are emitted in sorted
501 order.
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000502
Raymond Hettinger30c73622010-12-01 23:45:20 +0000503 To compute the product of an iterable with itself, specify the number of
504 repetitions with the optional *repeat* keyword argument. For example,
505 ``product(A, repeat=4)`` means the same as ``product(A, A, A, A)``.
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000506
Raymond Hettinger30c73622010-12-01 23:45:20 +0000507 This function is equivalent to the following code, except that the
508 actual implementation does not build up intermediate results in memory::
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000509
Raymond Hettinger30c73622010-12-01 23:45:20 +0000510 def product(*args, repeat=1):
511 # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
512 # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
513 pools = [tuple(pool) for pool in args] * repeat
514 result = [[]]
515 for pool in pools:
516 result = [x+[y] for x in result for y in pool]
517 for prod in result:
518 yield tuple(prod)
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000519
520
Raymond Hettingerd75ad442009-06-01 19:16:52 +0000521.. function:: repeat(object[, times])
Georg Brandl116aa622007-08-15 14:28:22 +0000522
Raymond Hettinger30c73622010-12-01 23:45:20 +0000523 Make an iterator that returns *object* over and over again. Runs indefinitely
524 unless the *times* argument is specified. Used as argument to :func:`map` for
525 invariant parameters to the called function. Also used with :func:`zip` to
526 create an invariant part of a tuple record. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000527
Raymond Hettinger30c73622010-12-01 23:45:20 +0000528 def repeat(object, times=None):
529 # repeat(10, 3) --> 10 10 10
530 if times is None:
531 while True:
532 yield object
533 else:
534 for i in range(times):
535 yield object
Georg Brandl116aa622007-08-15 14:28:22 +0000536
537
538.. function:: starmap(function, iterable)
539
Raymond Hettinger30c73622010-12-01 23:45:20 +0000540 Make an iterator that computes the function using arguments obtained from
541 the iterable. Used instead of :func:`map` when argument parameters are already
542 grouped in tuples from a single iterable (the data has been "pre-zipped"). The
543 difference between :func:`map` and :func:`starmap` parallels the distinction
544 between ``function(a,b)`` and ``function(*c)``. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000545
Raymond Hettinger30c73622010-12-01 23:45:20 +0000546 def starmap(function, iterable):
547 # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
548 for args in iterable:
549 yield function(*args)
Christian Heimes679db4a2008-01-18 09:56:22 +0000550
Georg Brandl116aa622007-08-15 14:28:22 +0000551
552.. function:: takewhile(predicate, iterable)
553
Raymond Hettinger30c73622010-12-01 23:45:20 +0000554 Make an iterator that returns elements from the iterable as long as the
555 predicate is true. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000556
Raymond Hettinger30c73622010-12-01 23:45:20 +0000557 def takewhile(predicate, iterable):
558 # takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
559 for x in iterable:
560 if predicate(x):
561 yield x
562 else:
563 break
Georg Brandl116aa622007-08-15 14:28:22 +0000564
565
Georg Brandl3dd33882009-06-01 17:35:27 +0000566.. function:: tee(iterable, n=2)
Georg Brandl116aa622007-08-15 14:28:22 +0000567
Raymond Hettinger30c73622010-12-01 23:45:20 +0000568 Return *n* independent iterators from a single iterable. Equivalent to::
Georg Brandl116aa622007-08-15 14:28:22 +0000569
Raymond Hettingercf984ce2009-02-18 20:56:51 +0000570 def tee(iterable, n=2):
571 it = iter(iterable)
572 deques = [collections.deque() for i in range(n)]
573 def gen(mydeque):
574 while True:
575 if not mydeque: # when the local deque is empty
576 newval = next(it) # fetch a new value and
577 for d in deques: # load it to all the deques
578 d.append(newval)
579 yield mydeque.popleft()
580 return tuple(gen(d) for d in deques)
Georg Brandl116aa622007-08-15 14:28:22 +0000581
Raymond Hettinger30c73622010-12-01 23:45:20 +0000582 Once :func:`tee` has made a split, the original *iterable* should not be
583 used anywhere else; otherwise, the *iterable* could get advanced without
584 the tee objects being informed.
Georg Brandl116aa622007-08-15 14:28:22 +0000585
Raymond Hettinger30c73622010-12-01 23:45:20 +0000586 This itertool may require significant auxiliary storage (depending on how
587 much temporary data needs to be stored). In general, if one iterator uses
588 most or all of the data before another iterator starts, it is faster to use
589 :func:`list` instead of :func:`tee`.
Georg Brandl116aa622007-08-15 14:28:22 +0000590
Georg Brandl116aa622007-08-15 14:28:22 +0000591
Georg Brandl3dd33882009-06-01 17:35:27 +0000592.. function:: zip_longest(*iterables, fillvalue=None)
Raymond Hettinger749761e2009-01-27 04:42:48 +0000593
Raymond Hettinger30c73622010-12-01 23:45:20 +0000594 Make an iterator that aggregates elements from each of the iterables. If the
595 iterables are of uneven length, missing values are filled-in with *fillvalue*.
596 Iteration continues until the longest iterable is exhausted. Equivalent to::
Raymond Hettinger749761e2009-01-27 04:42:48 +0000597
Raymond Hettinger30c73622010-12-01 23:45:20 +0000598 def zip_longest(*args, fillvalue=None):
599 # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
600 def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
601 yield counter() # yields the fillvalue, or raises IndexError
602 fillers = repeat(fillvalue)
603 iters = [chain(it, sentinel(), fillers) for it in args]
604 try:
605 for tup in zip(*iters):
606 yield tup
607 except IndexError:
608 pass
Raymond Hettinger749761e2009-01-27 04:42:48 +0000609
Raymond Hettinger30c73622010-12-01 23:45:20 +0000610 If one of the iterables is potentially infinite, then the :func:`zip_longest`
611 function should be wrapped with something that limits the number of calls
612 (for example :func:`islice` or :func:`takewhile`). If not specified,
613 *fillvalue* defaults to ``None``.
Raymond Hettinger749761e2009-01-27 04:42:48 +0000614
615
Georg Brandl116aa622007-08-15 14:28:22 +0000616.. _itertools-recipes:
617
Raymond Hettinger1fa76822010-12-06 23:31:36 +0000618Itertools Recipes
619-----------------
Georg Brandl116aa622007-08-15 14:28:22 +0000620
621This section shows recipes for creating an extended toolset using the existing
622itertools as building blocks.
623
624The extended tools offer the same high performance as the underlying toolset.
625The superior memory performance is kept by processing elements one at a time
626rather than bringing the whole iterable into memory all at once. Code volume is
627kept small by linking the tools together in a functional style which helps
628eliminate temporary variables. High speed is retained by preferring
Georg Brandl9afde1c2007-11-01 20:32:30 +0000629"vectorized" building blocks over the use of for-loops and :term:`generator`\s
Christian Heimesfe337bf2008-03-23 21:54:12 +0000630which incur interpreter overhead.
631
632.. testcode::
Georg Brandl116aa622007-08-15 14:28:22 +0000633
Raymond Hettinger30c73622010-12-01 23:45:20 +0000634 def take(n, iterable):
635 "Return first n items of the iterable as a list"
636 return list(islice(iterable, n))
Georg Brandl116aa622007-08-15 14:28:22 +0000637
Raymond Hettinger30c73622010-12-01 23:45:20 +0000638 def tabulate(function, start=0):
639 "Return function(0), function(1), ..."
640 return map(function, count(start))
Raymond Hettingerdd1150e2008-03-13 02:39:40 +0000641
Raymond Hettinger30c73622010-12-01 23:45:20 +0000642 def consume(iterator, n):
643 "Advance the iterator n-steps ahead. If n is none, consume entirely."
644 # Use functions that consume iterators at C speed.
645 if n is None:
646 # feed the entire iterator into a zero-length deque
647 collections.deque(iterator, maxlen=0)
648 else:
649 # advance to the empty slice starting at position n
650 next(islice(iterator, n, n), None)
Raymond Hettingerfa007962009-03-09 11:55:25 +0000651
Raymond Hettinger30c73622010-12-01 23:45:20 +0000652 def nth(iterable, n, default=None):
653 "Returns the nth item or a default value"
654 return next(islice(iterable, n, None), default)
Georg Brandl116aa622007-08-15 14:28:22 +0000655
Raymond Hettinger30c73622010-12-01 23:45:20 +0000656 def quantify(iterable, pred=bool):
657 "Count how many times the predicate is true"
658 return sum(map(pred, iterable))
Georg Brandl116aa622007-08-15 14:28:22 +0000659
Raymond Hettinger30c73622010-12-01 23:45:20 +0000660 def padnone(iterable):
661 """Returns the sequence elements and then returns None indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +0000662
Raymond Hettinger30c73622010-12-01 23:45:20 +0000663 Useful for emulating the behavior of the built-in map() function.
664 """
665 return chain(iterable, repeat(None))
Georg Brandl116aa622007-08-15 14:28:22 +0000666
Raymond Hettinger30c73622010-12-01 23:45:20 +0000667 def ncycles(iterable, n):
668 "Returns the sequence elements n times"
669 return chain.from_iterable(repeat(tuple(iterable), n))
Georg Brandl116aa622007-08-15 14:28:22 +0000670
Raymond Hettinger30c73622010-12-01 23:45:20 +0000671 def dotproduct(vec1, vec2):
672 return sum(map(operator.mul, vec1, vec2))
Georg Brandl116aa622007-08-15 14:28:22 +0000673
Raymond Hettinger30c73622010-12-01 23:45:20 +0000674 def flatten(listOfLists):
675 "Flatten one level of nesting"
676 return chain.from_iterable(listOfLists)
Georg Brandl116aa622007-08-15 14:28:22 +0000677
Raymond Hettinger30c73622010-12-01 23:45:20 +0000678 def repeatfunc(func, times=None, *args):
679 """Repeat calls to func with specified arguments.
Georg Brandl116aa622007-08-15 14:28:22 +0000680
Raymond Hettinger30c73622010-12-01 23:45:20 +0000681 Example: repeatfunc(random.random)
682 """
683 if times is None:
684 return starmap(func, repeat(args))
685 return starmap(func, repeat(args, times))
Georg Brandl116aa622007-08-15 14:28:22 +0000686
Raymond Hettinger30c73622010-12-01 23:45:20 +0000687 def pairwise(iterable):
688 "s -> (s0,s1), (s1,s2), (s2, s3), ..."
689 a, b = tee(iterable)
690 next(b, None)
691 return zip(a, b)
Georg Brandl116aa622007-08-15 14:28:22 +0000692
Raymond Hettinger30c73622010-12-01 23:45:20 +0000693 def grouper(n, iterable, fillvalue=None):
694 "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
695 args = [iter(iterable)] * n
696 return zip_longest(*args, fillvalue=fillvalue)
Georg Brandl116aa622007-08-15 14:28:22 +0000697
Raymond Hettinger30c73622010-12-01 23:45:20 +0000698 def roundrobin(*iterables):
699 "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
700 # Recipe credited to George Sakkis
701 pending = len(iterables)
702 nexts = cycle(iter(it).__next__ for it in iterables)
703 while pending:
704 try:
705 for next in nexts:
706 yield next()
707 except StopIteration:
708 pending -= 1
709 nexts = cycle(islice(nexts, pending))
Georg Brandl116aa622007-08-15 14:28:22 +0000710
Raymond Hettinger30c73622010-12-01 23:45:20 +0000711 def partition(pred, iterable):
712 'Use a predicate to partition entries into false entries and true entries'
713 # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
714 t1, t2 = tee(iterable)
715 return filterfalse(pred, t1), filter(pred, t2)
Raymond Hettinger5ce0aa22010-12-01 10:49:19 +0000716
Raymond Hettinger30c73622010-12-01 23:45:20 +0000717 def powerset(iterable):
718 "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
719 s = list(iterable)
720 return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Raymond Hettinger08d01ee2010-08-07 05:36:53 +0000721
Raymond Hettinger30c73622010-12-01 23:45:20 +0000722 def unique_everseen(iterable, key=None):
723 "List unique elements, preserving order. Remember all elements ever seen."
724 # unique_everseen('AAAABBBCCDAABBB') --> A B C D
725 # unique_everseen('ABBCcAD', str.lower) --> A B C D
726 seen = set()
727 seen_add = seen.add
728 if key is None:
729 for element in filterfalse(seen.__contains__, iterable):
730 seen_add(element)
731 yield element
732 else:
733 for element in iterable:
734 k = key(element)
735 if k not in seen:
736 seen_add(k)
737 yield element
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000738
Raymond Hettinger30c73622010-12-01 23:45:20 +0000739 def unique_justseen(iterable, key=None):
740 "List unique elements, preserving order. Remember only the element just seen."
741 # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
742 # unique_justseen('ABBCcAD', str.lower) --> A B C A D
743 return map(next, map(itemgetter(1), groupby(iterable, key)))
Raymond Hettingerad9d96b2009-01-02 21:39:07 +0000744
Raymond Hettinger30c73622010-12-01 23:45:20 +0000745 def iter_except(func, exception, first=None):
746 """ Call a function repeatedly until an exception is raised.
Raymond Hettingerfc91aa22010-03-28 18:27:13 +0000747
Raymond Hettinger30c73622010-12-01 23:45:20 +0000748 Converts a call-until-exception interface to an iterator interface.
749 Like __builtin__.iter(func, sentinel) but uses an exception instead
750 of a sentinel to end the loop.
Raymond Hettingerfc91aa22010-03-28 18:27:13 +0000751
Raymond Hettinger30c73622010-12-01 23:45:20 +0000752 Examples:
753 iter_except(functools.partial(heappop, h), IndexError) # priority queue iterator
754 iter_except(d.popitem, KeyError) # non-blocking dict iterator
755 iter_except(d.popleft, IndexError) # non-blocking deque iterator
756 iter_except(q.get_nowait, Queue.Empty) # loop over a producer Queue
757 iter_except(s.pop, KeyError) # non-blocking set iterator
Raymond Hettingerfc91aa22010-03-28 18:27:13 +0000758
Raymond Hettinger30c73622010-12-01 23:45:20 +0000759 """
760 try:
761 if first is not None:
762 yield first() # For database APIs needing an initial cast to db.first()
763 while 1:
764 yield func()
765 except exception:
766 pass
Raymond Hettingerfc91aa22010-03-28 18:27:13 +0000767
Raymond Hettinger30c73622010-12-01 23:45:20 +0000768 def random_product(*args, repeat=1):
769 "Random selection from itertools.product(*args, **kwds)"
770 pools = [tuple(pool) for pool in args] * repeat
771 return tuple(random.choice(pool) for pool in pools)
Raymond Hettingerfc91aa22010-03-28 18:27:13 +0000772
Raymond Hettinger30c73622010-12-01 23:45:20 +0000773 def random_permutation(iterable, r=None):
774 "Random selection from itertools.permutations(iterable, r)"
775 pool = tuple(iterable)
776 r = len(pool) if r is None else r
777 return tuple(random.sample(pool, r))
Raymond Hettinger063a4b62010-04-02 04:18:18 +0000778
Raymond Hettinger30c73622010-12-01 23:45:20 +0000779 def random_combination(iterable, r):
780 "Random selection from itertools.combinations(iterable, r)"
781 pool = tuple(iterable)
782 n = len(pool)
783 indices = sorted(random.sample(range(n), r))
784 return tuple(pool[i] for i in indices)
Raymond Hettinger063a4b62010-04-02 04:18:18 +0000785
Raymond Hettinger30c73622010-12-01 23:45:20 +0000786 def random_combination_with_replacement(iterable, r):
787 "Random selection from itertools.combinations_with_replacement(iterable, r)"
788 pool = tuple(iterable)
789 n = len(pool)
790 indices = sorted(random.randrange(n) for i in range(r))
791 return tuple(pool[i] for i in indices)
Raymond Hettinger063a4b62010-04-02 04:18:18 +0000792
Raymond Hettingerfc91aa22010-03-28 18:27:13 +0000793Note, many of the above recipes can be optimized by replacing global lookups
794with local variables defined as default values. For example, the
795*dotproduct* recipe can be written as::
796
Raymond Hettinger30c73622010-12-01 23:45:20 +0000797 def dotproduct(vec1, vec2, sum=sum, map=map, mul=operator.mul):
798 return sum(map(mul, vec1, vec2))