How to generate only rotationally-unique permutations?

Zero Piraeus schesis at gmail.com
Sat May 19 04:21:35 EDT 2012


:

On 19 May 2012 01:23, John O'Hagan <research at johnohagan.com> wrote:
> How to generate only the distinct permutations of a sequence which are not
> rotationally equivalent to any others? More precisely, to generate only the most
> "left-packed" of each group of rotationally equivalent permutations, such that
> for each permutation p:

It's late and I'm tired (and the solution below isn't a generator), but ...

itertools.permutations() generates results in lexicographic order [1],
so if you reverse-sort the sequence before processing it, when you get
a sequence back whose first item isn't the maximum, you'll know that
you've got all the sequences whose first item *is* the maximum - which
means you can bail at that point.

Wow, that's a nasty sentence. As I said, tired. Anyway - you'll get
dupes if there are non-unique items in the rest of the sequence, so
some form of filtering is required, but you could use a set to handle
that. Something like:

    from itertools import permutations

    def rot_uniq_perms(seq):
        result = set()
        seq = sorted(seq, reverse=True)
        maximum = seq[0]
        for x in permutations(seq):
            if x[0] != maximum:
                break
            else:
                result.add(x[::-1])
        return result

No idea how this performs compared to your existing solution, but it
might be a starting point.

[1] http://docs.python.org/library/itertools.html#itertools.permutations

 -[]z.



More information about the Python-list mailing list