Generating all combinations

Raymond Hettinger python at
Thu Jun 4 02:27:50 EDT 2009

> Nice one!

It only does partitions of a sequence.  I haven't yet looked at a way
do partitions of a set.  Any ideas?

> Raymond, as perhaps *the* principle contributor to itertools, do you feel
> that the combinatorics-related tools should be in their own module? Or is
> that dividing the module too fine?

I like having them in itertools because they form part of the
"iterator algebra"
for splitting, filtering, joining, and combining streams of iterators.

> Would you consider moving permutations() and friends into a module
> together with functions for calculating the number of permutations etc?
> e.g. permutations(iterable[, r]) --> permutations object
>      nPr(n, r) --> int

Looked at this a while back.  If the nPr style functions go in, they
probably be in the math module (or a new module for integer functions
like gcd and whatnot).  The reason for not keeping them together is
the use cases are likely disjoint -- when I go to my calculator for
I don't expect a listing -- when I need to loop over permutations, I
typically only care about the contents of the permutation, not the
number of them (except for purposes of estimating how long a search
take).  People look to the math module for things they find on their
calculator and to the itertools module for high-speed looping

Also, there is a issue of naming the functions.  For combinations, you
you might think to look for ncombs() or somesuch, but
is what someone else may be searching for.

What would be nice is to turn the itertool combinatorics into
classes with a len() method, an ability to index to the n-th
iteration, or to find at an arbitrary iteration:

>>> c = combinations('monte', 3)
>>> len(c)
>>> c[2]
('m', 'o', 'e')
>>> c.find(('m', 't', 'e'))
>>> random.choice(c)
('o', 'n', 'e')

If the input iterable contains repeats, the find() method
would find the first match.

These things are interesting and fun, but they also smell
of feeping-creaturism.


More information about the Python-list mailing list