Skip to content

Commit 67dfa50

Browse files
committed
added sparse array example of emulating sequences
1 parent bf1034a commit 67dfa50

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
"""
3+
example of a callable class
4+
"""
5+
6+
class SparseArray(object):
7+
8+
def __init__(self, my_array=()):
9+
self.length = len(my_array)
10+
self.sparse_array = self.convert_to_sparse(my_array)
11+
12+
def convert_to_sparse(self, my_array):
13+
sparse_array = {}
14+
for index, number in enumerate(my_array):
15+
if number:
16+
sparse_array[index] = number
17+
return sparse_array
18+
19+
def __len__(self):
20+
return self.length
21+
22+
def __getitem__(self, key):
23+
try:
24+
return self.sparse_array[key]
25+
except KeyError:
26+
if key >= self.length:
27+
raise IndexError('array index out of range')
28+
return 0
29+
30+
def __setitem__(self, key, value):
31+
if key > self.length:
32+
raise IndexError('array assignment index out of range')
33+
if value != 0:
34+
self.sparse_array[key] = value
35+
else:
36+
# if the value is being set to zero, we probably need to
37+
# remove a key from our dictionary.
38+
self.sparse_array.pop(key, None)
39+
40+
def __delitem__(self, key):
41+
# we probably need to move the keys if we are not deleting the last
42+
# number, use pop in case it was a zero
43+
if key == self.length - 1:
44+
self.sparse_array.pop(key, None)
45+
else:
46+
# since we need to adjust all of the keys after the one we are
47+
# deleting, probably most efficient to create a new dictionary
48+
new_dict = {}
49+
for k, v in self.sparse_array.iteritems():
50+
if k >= key:
51+
new_dict[k - 1] = v
52+
else:
53+
new_dict[k] = v
54+
# note we don't want to do update, since we need to make sure we are
55+
# getting rid of the old keys, when we moved the value to a new key
56+
self.sparse_array = new_dict
57+
# length is now one shorter
58+
self.length -= 1
59+
60+
61+
62+
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import pytest
2+
from sparse_array import SparseArray
3+
4+
5+
def set_up():
6+
my_array = [2, 0, 0, 0, 3, 0, 0, 0, 4, 5, 6, 0, 2, 9]
7+
my_sparse = SparseArray(my_array)
8+
return (my_array, my_sparse)
9+
10+
def test_object_exists():
11+
my_array, my_sparse = set_up()
12+
assert isinstance(my_sparse, SparseArray)
13+
14+
def test_get_non_zero_number():
15+
my_array, my_sparse = set_up()
16+
assert my_sparse[4] == 3
17+
18+
def test_get_zero():
19+
my_array, my_sparse = set_up()
20+
assert my_sparse[1] == 0
21+
22+
def test_get_element_not_in_array():
23+
my_array, my_sparse = set_up()
24+
with pytest.raises(IndexError):
25+
my_sparse[14]
26+
27+
def test_get_lenght():
28+
my_array, my_sparse = set_up()
29+
assert len(my_sparse) == 14
30+
31+
def test_change_number_in_array():
32+
my_array, my_sparse = set_up()
33+
my_sparse[0] = 3
34+
assert my_sparse[0] == 3
35+
# make sure others aren't changed
36+
assert my_sparse[1] == 0
37+
# make sure still same length
38+
assert len(my_sparse) == 14
39+
40+
def test_change_number_in_array_to_zero():
41+
my_array, my_sparse = set_up()
42+
my_sparse[4] = 0
43+
assert my_sparse[4] == 0
44+
# make sure still same length
45+
assert len(my_sparse) == 14
46+
47+
def test_change_number_in_array_from_zero():
48+
my_array, my_sparse = set_up()
49+
my_sparse[1] = 4
50+
assert my_sparse[1] == 4
51+
# make sure still same length
52+
assert len(my_sparse) == 14
53+
54+
def test_delete_number():
55+
my_array, my_sparse = set_up()
56+
del(my_sparse[4])
57+
# if we delete the 4 position, should now be zero
58+
assert my_sparse[4] == 0
59+
# should have smaller length
60+
assert len(my_sparse) == 13
61+
62+
def test_delete_zero():
63+
my_array, my_sparse = set_up()
64+
del(my_sparse[5])
65+
# should still be zero, but should have shorter length
66+
assert my_sparse[5] == 0
67+
assert len(my_sparse) == 13
68+
69+
def test_delete_last_number():
70+
my_array, my_sparse = set_up()
71+
del(my_sparse[13])
72+
# should get an error?
73+
print 'print some stuf damnit'
74+
with pytest.raises(IndexError):
75+
my_sparse[13]
76+
assert len(my_sparse) == 13
77+
78+
79+

0 commit comments

Comments
 (0)