# 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()

-

```