Send your polygons out to a numpy array... just the coordinates for testing.
Since your polygons will be properly ordered clockwise if you made them in ArcMap, then the process is a bit fiddly.
Consider a square defined by the coordinates in array 'a'.
I made 3 other polygons, rotated about the center so that the lower left corner of 'a' was in a different position.
When you have this inside NumPy, it is a matter of reordering the structured array so that the minimum of a 'sort' is used to 'roll' the points into their desired position. This only works if the minimum is the lower left corner. The sad thing that comparing and/or locating the minimum x value does not mean that you will have the lower left corner... consider a polygon leaning to the left at the top or the bottom left kicked in a bit.
Anyway, for some fun... For the nice square.
>>> a
array([(0, 0), (0, 1), (1, 1), (1, 0)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> b
array([(1, 0), (0, 0), (0, 1), (1, 1)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> c
array([(1, 1), (1, 0), (0, 0), (0, 1)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> d
array([(0, 1), (1, 1), (1, 0), (0, 0)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> a_i = a.argsort()[0]
>>> b_i = b.argsort()[0]
>>> c_i = c.argsort()[0]
>>> d_i = d.argsort()[0]
>>> a_i, b_i, c_i, d_i
(0, 1, 2, 3)
>>>
>>>
>>> a
array([(0, 0), (0, 1), (1, 1), (1, 0)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> np.roll(b,-1)
array([(0, 0), (0, 1), (1, 1), (1, 0)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> np.roll(c, -2)
array([(0, 0), (0, 1), (1, 1), (1, 0)],
dtype=[('x', '<i8'), ('y', '<i8')])
>>> np.roll(d, -3)
array([(0, 0), (0, 1), (1, 1), (1, 0)],
dtype=[('x', '<i8'), ('y', '<i8')])
Now as a test, let's check the case where the bottom left isn't the minimum X and Y.
>>> a
array([(0.1, 0.1), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> b
array([(1.0, 0.0), (0.1, 0.1), (0.0, 1.0), (1.0, 1.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> c
array([(1.0, 1.0), (1.0, 0.0), (0.1, 0.1), (0.0, 1.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> d
array([(0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.1, 0.1)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> a_i = a.argsort()[0]
>>> b_i = b.argsort()[0]
>>> c_i = c.argsort()[0]
>>> d_i = d.argsort()[0]
>>> a_i, b_i, c_i, d_i
(1, 2, 3, 0)
>>> a
array([(0.1, 0.1), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> np.roll(b, -1)
array([(0.1, 0.1), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> np.roll(c, -2)
array([(0.1, 0.1), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> np.roll(c, -3)
array([(0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.1, 0.1)],
dtype=[('x', '<f8'), ('y', '<f8')])
>>> np.roll(d, -3)
array([(0.1, 0.1), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)],
dtype=[('x', '<f8'), ('y', '<f8')])
Looks ok-ish... but I would experiment with your 'rolling' just to make sure.