All permutations of a list

Rainer Deyke root at rainerdeyke.com
Sun Oct 22 00:22:07 EDT 2000


"Richard van de Stadt" <stadt at cs.utwente.nl> wrote in message
news:39F1FB22.6E9246E7 at cs.utwente.nl...
> Then a collegue of mine impressed me with a recursive program
> in the functional language Miranda/Amanda:
>
> ins a []     = [[a]]
> ins a (x:xs) = (a:x:xs) : map (x:) (ins a xs)
>
> perms []     = [[]]
> perms (x:xs) = concat (map (ins x) (perms xs))
>
> 'ins a xs' returns a list of all possible extensions of
> the list xs by inserting element a.
> 'perms xs' returns the list of all possible permutations
> of the list xs.
> 'concat' joins lists.
>
> Is such an elegant recursive solution possible in Python?

Here's a direct translation:

def ins(a, list):
  if list == []:
    return [[a]]
  return [[a] + list] + map(lambda tail, head = list[0]:\
    [head] + tail, ins(a, list[1:]))

def perms(list):
  if list == []:
    return [[]]
  return concat(map(lambda tail, head = list[0]: ins(head, tail),
    perms(list[1:])))

def concat(list):
  return [o for l in list for o in l]

This can be made more elegant by using Python idioms.  For exampe, the
function 'ins' could be rewritten like this:

def ins(a, list):
  return [list[:i] + [a] + list[i:] for i in range(len(list) + 1)]


--
Rainer Deyke (root at rainerdeyke.com)
Shareware computer games           -           http://rainerdeyke.com
"In ihren Reihen zu stehen heisst unter Feinden zu kaempfen" - Abigor





More information about the Python-list mailing list