9.7. itertools — Functions creating iterators for efficient looping¶
New in version 2.3:
New in version 2.3.
This module implements a number of iterator building blocks inspired by constructs from APL, Haskell, and SML. Each has been recast in a form suitable for Python.
The module standardizes a core set of fast, memory efficient tools that are useful by themselves or in combination. Together, they form an “iterator algebra” making it possible to construct specialized tools succinctly and efficiently in pure Python.
For instance, SML provides a tabulation tool: tabulate(f) which produces a
sequence f(0), f(1), .... The same effect can be achieved in Python
by combining imap() and count() to form imap(f, count()).
These tools and their built-in counterparts also work well with the high-speed
functions in the operator module. For example, the multiplication
operator can be mapped across two vectors to form an efficient dot-product:
sum(imap(operator.mul, vector1, vector2)).
Infinite Iterators:
| Iterator | Arguments | Results | Example |
|---|---|---|---|
count() |
start | start, start+1, start+2, ... | count(10) --> 10 11 12 13 14 ... |
cycle() |
p | p0, p1, ... plast, p0, p1, ... | cycle('ABCD') --> A B C D A B C D ... |
repeat() |
elem [,n] | elem, elem, elem, ... endlessly or up to n times | repeat(10, 3) --> 10 10 10 |
Iterators terminating on the shortest input sequence:
| Iterator | Arguments | Results | Example |
|---|---|---|---|
chain() |
p, q, ... | p0, p1, ... plast, q0, q1, ... | chain('ABC', 'DEF') --> A B C D E F |
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 |
groupby() |
iterable[, keyfunc] | sub-iterators grouped by value of keyfunc(v) | |
ifilter() |
pred, seq | elements of seq where pred(elem) is True | ifilter(lambda x: x%2, range(10)) --> 1 3 5 7 9 |
ifilterfalse() |
pred, seq | elements of seq where pred(elem) is False | ifilterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 |
islice() |
seq, [start,] stop [, step] | elements from seq[start:stop:step] | islice('ABCDEFG', 2, None) --> C D E F G |
imap() |
func, p, q, ... | func(p0, q0), func(p1, q1), ... | imap(pow, (2,3,10), (5,2,3)) --> 32 9 1000 |
starmap() |
func, seq | func(*seq[0]), func(*seq[1]), ... | starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000 |
tee() |
it, n | it1, it2 , ... itn splits one iterator into n | |
takewhile() |
pred, seq | seq[0], seq[1], until pred fails | takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4 |
izip() |
p, q, ... | (p[0], q[0]), (p[1], q[1]), ... | izip('ABCD', 'xy') --> Ax By |
izip_longest() |
p, q, ... | (p[0], q[0]), (p[1], q[1]), ... | izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- |
Combinatoric generators:
| Iterator | Arguments | Results |
|---|---|---|
product() |
p, q, ... [repeat=1] | cartesian product, equivalent to a nested for-loop |
permutations() |
p[, r] | r-length tuples, all possible orderings, no repeated elements |
combinations() |
p, r | r-length tuples, in sorted order, no repeated elements |
product('ABCD', repeat=2) |
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD |
|
permutations('ABCD', 2) |
AB AC AD BA BC BD CA CB CD DA DB DC |
|
combinations('ABCD', 2) |
AB AC AD BC BD CD |
9.7.1. Itertool functions¶
The following module functions all construct and return iterators. Some provide streams of infinite length, so they should only be accessed by functions or loops that truncate the stream.
-
itertools.chain(*iterables)¶ Make an iterator that returns elements from the first iterable until it is exhausted, then proceeds to the next iterable, until all of the iterables are exhausted. Used for treating consecutive sequences as a single sequence. Equivalent to:
def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element
-
classmethod
chain.from_iterable(iterable)¶ Alternate constructor for
chain(). Gets chained inputs from a single iterable argument that is evaluated lazily. Equivalent to:@classmethod def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element
New in version 2.6:
New in version 2.6.
-
itertools.combinations(iterable, r)¶ Return r length subsequences of elements from the input iterable.
Combinations are emitted in lexicographic sort order. So, if the input iterable is sorted, the combination tuples will be produced in sorted order.
Elements are treated as unique based on their position, not on their value. So if the input elements are unique, there will be no repeat values in each combination.
Equivalent to:
def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = range(r) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices)
The code for
combinations()can be also expressed as a subsequence ofpermutations()after filtering entries where the elements are not in sorted order (according to their position in the input pool):def combinations(iterable, r): pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices)
The number of items returned is
n! / r! / (n-r)!when0 <= r <= nor zero whenr > n.New in version 2.6:
New in version 2.6.