On Mon, 15 Aug 2005, Matt Hammond wrote:

> Just satisfied my curiosity wrt this problem, so I might as well share :-)
>
>>>> def permute(list):

How about:

def permutation(l, i):
        "Makes the ith permutation of the sequence l."
        # leave out the reverses if you don't care about the order of the 
permutations
        l_ = []; l_[:] = l; l_.reverse()
        m = []
        for j in xrange(len(l_)):
                m.append(l_.pop((i % len(l_))))
                i = i / (len(l_) + 1)
        m.reverse()
        return m

def factorial(n):
        if (n == 1): return 1
        else: return n * factorial((n - 1))

def permute(l):
        for i in xrange(factorial(len(l))):
                yield permutation(l, i)

>>> for o in permute([1,2,3]): print o
...
[1, 2, 3]
[1, 3, 2]
[2, 3, 1]
[2, 1, 3]
[3, 1, 2]
[3, 2, 1]

The thing i like about doing it this way is that you can use 
permutation(l, i) to make arbitrary permutations on their own, should you 
ever need to do that.

Also, it gives you an easy way to make only the even permutations of a 
list - just feed even numbers into permutation(l, i) (i think!). This 
could be useful if you wanted to build an alternating group for some 
obscure discrete mathematics purpose.

tom

-- 
The future is still out there, somewhere.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to