Most pythonic way of rotating a circular list to a canonical point

Marko Rauhamaa marko at pacujo.net
Sat Aug 1 22:57:06 CEST 2015


Lukas Barth <mail at tinloaf.de>:

> I have a list of numbers that I treat as "circular", i.e. [1,2,3] and
> [2,3,1] should be the same. Now I want to rotate these to a well defined
> status, so that I can can compare them.
>
> If all elements are unique, the solution is easy: find the minimum
> element, find its index, then use mylist[:index] + mylist[index:], i.e.
> the minimum element will always be at the beginning.
>
> But say I have [0,1,0,2,0,3]. I can in fact guarantee that no *pair*
> will appear twice in that list, i.e. I could search for the minimum, if
> that is unique go on as above, otherwise find *all* positions of the
> minimum, see which is followed by the smallest element, and then rotate
> that position to the front.
>
> Now that seems an awful lot of code for a (seemingly?) simple problem.
> Is there a nice, pythonic way to do this?

How about:

========================================================================
def circularly_equal(l1, l2):
    length = len(l1)
    if length != len(l2):
        return False
    twice = l1 + l1
    for i in range(length):
        if twice[i:i + length] == l2:
            return True
    return False
========================================================================


Marko


More information about the Python-list mailing list