Permutations algoritm?

Manuel M. Garcia mgarcia at cole-switches.com
Fri Nov 15 18:40:44 EST 2002


On Fri, 15 Nov 2002 15:51:04 -0600, sismex01 at hebmex.com wrote:
(edit)
>Of a set of different items 'S', obtain all distinct subsets of 'n'
>items where all items in the subset are different.
>
>So, if I have, for example:
>
>   S = [ 0, 1, 2, 3 ]
>
>the universe of available subsets of 3 items would be:
>
>   s = [ (0, 1, 2),
>         (0, 1, 3),
>         (0, 2, 3),
>         (1, 2, 3) ]
>
>the universe of available subsets of 2 items would be:
>
>   s = [ (0, 1),
>         (0, 2),
>         (0, 3),
>         (1, 2),
>         (1, 3),
>         (2, 3) ]

import pprint

def _subsets_ofsize_help(n, m):
    if m == 0:
        return [ [] ]
    elif n == 0:
        return []
    elif m == 1:
        return [ [i] for i in range(n) ]
    else:
        s0 = _subsets_ofsize_help(n-1,m)
        s1 = _subsets_ofsize_help(n-1,m-1)
        for i in range(len(s1)):
            s1[i].append(n-1)
        s0.extend(s1)
        return s0

def _subsets_help(n):
    s = [ [] ]
    if n == 0: return s
    for i in range(n):
        s0 = _subsets_ofsize_help(n,i+1)
        s0.sort()
        s.extend(s0)
    return s

def DistinctSubsets(set):
    return [ tuple([set[i] for i in s])
             for s in _subsets_help(len(set)) ]

pprint.pprint(
    DistinctSubsets(
        ('Sunday',
         'Monday',
         'Tuesday',
         'Wednesday',
         'Thursday')) )

----Output-----

[(),
 ('Sunday',),
 ('Monday',),
 ('Tuesday',),
 ('Wednesday',),
 ('Thursday',),
 ('Sunday', 'Monday'),
 ('Sunday', 'Tuesday'),
 ('Sunday', 'Wednesday'),
 ('Sunday', 'Thursday'),
 ('Monday', 'Tuesday'),
 ('Monday', 'Wednesday'),
 ('Monday', 'Thursday'),
 ('Tuesday', 'Wednesday'),
 ('Tuesday', 'Thursday'),
 ('Wednesday', 'Thursday'),
 ('Sunday', 'Monday', 'Tuesday'),
 ('Sunday', 'Monday', 'Wednesday'),
 ('Sunday', 'Monday', 'Thursday'),
 ('Sunday', 'Tuesday', 'Wednesday'),
 ('Sunday', 'Tuesday', 'Thursday'),
 ('Sunday', 'Wednesday', 'Thursday'),
 ('Monday', 'Tuesday', 'Wednesday'),
 ('Monday', 'Tuesday', 'Thursday'),
 ('Monday', 'Wednesday', 'Thursday'),
 ('Tuesday', 'Wednesday', 'Thursday'),
 ('Sunday', 'Monday', 'Tuesday', 'Wednesday'),
 ('Sunday', 'Monday', 'Tuesday', 'Thursday'),
 ('Sunday', 'Monday', 'Wednesday', 'Thursday'),
 ('Sunday', 'Tuesday', 'Wednesday', 'Thursday'),
 ('Monday', 'Tuesday', 'Wednesday', 'Thursday'),
 ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday')]

Manuel



More information about the Python-list mailing list