moving items in a list

Mark McEahern mark at mceahern.com
Tue Jan 7 22:30:07 CET 2003


Below is some code and unit tests to demonstrate how I'm moving items in a
list.  It works, but I'm sure I'll learn a lot by any feedback you care to
offer.

Cheers,

// m

#!/usr/bin/env python

"""
move 'up' means move the item once towards the first item.

move 'down' means move the item once towards the last item.
"""

import unittest

def move_up(l, m):
    """Move items in m found in l up one position."""
    for i in range(len(l)):
        if i == 0:
            continue
        item = l[i]
        if item not in m:
            continue
        j = i - 1
        swap_with = l[j]
        l[i] = swap_with
        l[j] = item

def move_down(l, m):
    """Move items in m found in l down one position."""
    for i in range(len(l) - 1, 0, -1):
        if i == len(l) - 1:
            continue
        item = l[i]
        if item not in m:
            continue
        j = i + 1
        swap_with = l[j]
        l[i] = swap_with
        l[j] = item

class test(unittest.TestCase):

    def test_move_up(self):
        l = range(10)
        m = [4, 5]
        move_up(l, m)
        expected = [0, 1, 2, 4, 5, 3, 6, 7, 8, 9]
        self.assertEquals(l, expected)

        l = range(10)
        m = [0]
        move_up(l, m)
        expected = range(10)
        self.assertEquals(l, expected)

        l = range(10)
        m = [1, 3, 5, 7, 9]
        move_up(l, m)
        expected = [1, 0, 3, 2, 5, 4, 7, 6, 9, 8]
        self.assertEquals(l, expected)

    def test_move_down(self):
        l = range(10)
        m = [4, 5]
        move_down(l, m)
        expected = [0, 1, 2, 3, 6, 4, 5, 7, 8, 9]
        self.assertEquals(l, expected)

        l = range(10)
        m = [9]
        move_down(l, m)
        expected = range(10)
        self.assertEquals(l, expected)

        l = range(10)
        m = [1, 3, 5, 7, 9]
        move_down(l, m)
        expected = [0, 2, 1, 4, 3, 6, 5, 8, 7, 9]
        self.assertEquals(l, expected)

if __name__ == '__main__':
    unittest.main()

-






More information about the Python-list mailing list