Search code examples
pythonvariablesfractions

"Properly" organise (spread out) x and y data


Not really sure how to word this question, so I will give an example of what I want.

I have two variables xsteps and ysteps.

If xsteps is 4 and ysteps is 2, then I would like a variable result to be "x, x, y, x, x, y"
If xsteps is 10 and ysteps is 5, then I would like result to be "x, x, y, x, x, y, x, x, y, x, x, y, x, x, y"
If xsteps is 15 and ysteps is 5 then I would like result to be "x, x, x, y, x, x, x, y, x, x, x, y, x, x, x, y, x, x, x, y"
If xsteps is 1 and ysteps is 6, I would like result to be "x, y, y, y, y, y, y"
If xsteps is 4 and ysteps is 4, I would like result to be "x, y, x, y, x, y, x, y"
If xsteps is 10 and ysteps is 4, I would like result to be "x, x, y, x, x, y, x, x, y, x, x, y, x, x"

Xsteps and ysteps are not always easily divisible. If they do not divide, then I would just like them to be kind of separated out. It does not need to be perfect, just so it spreads them out reasonable well.

Really, I need the xsteps and ysteps variables organised into one variable that spreads them out.


Solution

  • You can try something like this:

    from __future__ import division
    def spreadout(X, Y):
        ratio = len(X) / len(Y)
        result = []
        while X or Y:
            if not Y or len(X)/len(Y) >= ratio:
                result.append(X.pop())
            else:
                result.append(Y.pop())
        return result
    

    The idea behind the algorithm is to determine the ratio of the X andY lists and to alternately pop elements from either of the lists to keep the ratio in the result list similar.

    This implementaiton works with lists of arbitrary elements and will return the result as a list. If you want just your x,y string, the code can be simplified and optimized some, e.g. using len this often would be wasteful is you have very long lists of xs and ys. Or you can just write a wrapper for that:

    def xy_wrapper(x, y):
        return ",".join(spreadout(['x'] * x, ['y'] * y))
    

    Example Output:

    >>> spreadout(range(6), list("ABC"))
    [5, 'C', 4, 3, 'B', 2, 1, 'A', 0]
    >>> xy_wrapper(5, 17)
    'x,y,y,y,y,x,y,y,y,x,y,y,y,y,x,y,y,y,x,y,y,y'