reorder_list.py

#! /usr/bin/python3
# ==================================================================
# Reorder the elements in a list
#
# Reorder the list every Nth element.
#
# Note: There is no way to recover the original order of the list
# elements when sort is used. The original list's order
# information is lost.
#
# See the sort related code. What happens when sort is used?
#
# ------------------------------------------------------------------
#
# For example with sort (step every third element):
#
# original list  [44, 3, 56, 2, 56, 8, 9, 43, 22, 1]
# reordered list [1, 9, 44, 2, 22, 56, 3, 43, 56, 8]
# restored list? [1, 2, 3, 8, 9, 22, 43, 44, 56, 56]
#
# ==================================================================
#
# notes:
#
# 1. for python2 try xrange
#
# ==================================================================


# ---- reorder list ------------------------------------------------

def reorder_list(oldlist,step,use_sort=False):
    '''
    Reorder a list given an integer step value.

    use_sort defaults to False. Use True to use a sort.
    '''

    ##print('\nReorder List (step={},sort={})'.format(step,use_sort))

    sortlist = list(oldlist)

    if use_sort:                         # sort the original list?
        sortlist.sort()

    newlist = list(sortlist)             # list to modify and return

    l = len(newlist)                     # list length

    jj = 0
    j  = 0
    s  = 0

    ##print('')

    for i in range(0,l):

        ##print('i={}   j={}  src={}'.format(i,j,sortlist[i]))

        newlist[j] = sortlist[i]

        j += step

        if j >= l:
            jj += 1
            j   = jj
            ##print('')

    print('')
    print('---- Reorder list ----------------------------')
    print('step     = {}'.format(step))
    print('use sort = {}'.format('True' if use_sort else 'False'))
    print('original   {}'.format(oldlist))
    if use_sort:
        print('sorted     {}'.format(sortlist))
    print('reordered  {}'.format(newlist))


    return newlist


# ---- restore list ------------------------------------------------

def restore_list(oldlist,step):
    '''
    Restore a reordered list given an integer step value.

    Note: There is no way to recover the original order of the list
          elements because of the sort. The original list's order 
          information is lost.
    '''
    ##print('\nRestore List (step={})'.format(step))

    newlist = list(oldlist)

    l = len(newlist)                     # list length

    ii = 0
    i  = 0
    s  = 0

    ##print('')
    for j in range(0,l):

        ##print('j={}   i={}  src={}'.format(j,i,oldlist[j]))

        newlist[j] = oldlist[i]

        i += step

        if i >= l:
            ii += 1
            i   = ii
            ##print('')

    print('')
    print('---- Restored list ---------------------------')
    print('step     = {}'.format(step))
    print('reordered  {}'.format(oldlist))
    print('restored   {}'.format(newlist))

    return newlist


# --- main ---------------------------------------------------------

if __name__ == '__main__':

    l = [44,3,56,2,56,8,9,43,22,1]       # test list

    step = 3                             # reorder step count


    print('\n==== reordere without sort ===================')  

    ll = reorder_list(l,step)

    lll = restore_list(ll,step)


    print('\n==== reorder with sort =======================')

    ll = reorder_list(l,step,True)

    lll = restore_list(ll,step)