Skip to content

Commit c2effdc

Browse files
committed
added updated sparse array
1 parent 79a771e commit c2effdc

File tree

2 files changed

+55
-29
lines changed

2 files changed

+55
-29
lines changed
Lines changed: 54 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,62 @@
1-
#!/usr/bin/env python
21

2+
"""
3+
example of emulating a sequence
4+
"""
35

46
class SparseArray(object):
5-
def __init__(self, iterable):
6-
self.values = {}
7-
self.length = len(iterable)
8-
for i, val in enumerate(iterable):
9-
if val:
10-
self.values[i] = val
11-
print self.values
12-
13-
def __getitem__(self, index):
14-
if index >= self.length:
15-
raise IndexError("sparse array index out of range")
16-
else:
17-
return self.values.get(index, 0)
187

19-
def __setitem__(self, index, value):
20-
if index >= self.length:
21-
raise IndexError("sparse array index out of range")
22-
else:
23-
if value == 0:
24-
self.values.pop(index, None)
25-
else:
26-
self.values[index] = value
27-
28-
def __delitem__(self, index):
29-
if index >= self.length:
30-
raise IndexError("sparse array index out of range")
31-
else:
32-
self.values.pop(index, None)
33-
self.length -= 1
8+
def __init__(self, my_array=()):
9+
self.length = len(my_array)
10+
self.sparse_array = self.convert_to_sparse(my_array)
3411

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
3518

3619
def __len__(self):
3720
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+

Solutions/Session08/test_sparse_array.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
from sparse_array import SparseArray
33

4+
45
def set_up():
56
my_array = [2, 0, 0, 0, 3, 0, 0, 0, 4, 5, 6, 0, 2, 9]
67
my_sparse = SparseArray(my_array)

0 commit comments

Comments
 (0)