all possible combinations

Jack Diederich jack at performancedrivers.com
Wed Jul 13 12:37:50 EDT 2005


On Wed, Jul 13, 2005 at 05:07:33PM +0100, Duncan Smith wrote:
> rbt wrote:
> > On Wed, 2005-07-13 at 11:09 -0400, rbt wrote:
> > 
> >>On Wed, 2005-07-13 at 10:21 -0400, rbt wrote:
> >>
> >>>Say I have a list that has 3 letters in it:
> >>>
> >>>['a', 'b', 'c']
> >>>
> >>>I want to print all the possible 4 digit combinations of those 3
> >>>letters:
> >>>
> >>>4^3 = 64
> >>>
> >>>aaaa
> >>>abaa
> >>>aaba
> >>>aaab
> >>>acaa
> >>>aaca
> >>>aaac
> >>>...
> >>>
> >>>What is the most efficient way to do this? 
> >>
> >>Expanding this to 4^4 (256) to test the random.sample function produces
> >>interesting results. It never finds more than 24 combinations out of the
> >>possible 256. This leads to the question... how 'random' is sample ;)
> >>
> >>Try it for yourselves:
> >>
> >>test = list('1234')
> >>
> >>combinations = []
> >>while 1:
> >>    combo = random.sample(test, 4)
> >>    possibility = ''.join(combo)
> >>    if possibility not in combinations:
> >>        print possibility    
> >>        combinations.append(possibility)
> >>        continue
> >>    else:
> >>        continue
> >>
> > 
> > 
> > Someone pointed out off-list that this is doing permutation, not
> > combination. Is there a way to make random.sample to do combinations?
> > 
> Probably not in any sensible way.  But what you list in your original
> post are not distinct combinations.  e.g. abaa and aaba are both 3 a's
> and 1 b.  Maybe you mean that order does matter (and you're actually
> looking for all distinct permutations of all combinations)?
> 
This is called a cartesian product, and the easiest way is to do

import probstat # probstat.sourceforge.net
letters = list('abcd')
for (guys) in probstat.Cartesian([letters] * 4):
  print ''.join(guys)

It's a C module I wrote to do this stuff a few years ago, still compiles
and runs just fine (at least on linux).

-jackdied



More information about the Python-list mailing list